Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Railsでつくる 画像アップロード 2017 #railsdm /rails_develop...
Search
matsuhisa
October 19, 2017
Programming
1.2k
0
Share
Railsでつくる 画像アップロード 2017 #railsdm /rails_developers_meetup6_image_upload
#railsdm
https://techplay.jp/event/631425
matsuhisa
October 19, 2017
More Decks by matsuhisa
See All by matsuhisa
Rails移行のレキシ/mobasif-to-ruby-on-rails2017
matsuhisa
1
1.7k
デザインレビューにエンジニアも参加してみよう/engineers-join-design-review-2017
matsuhisa
0
1.2k
「ふつう」のRuby on Rails ウェブアプリケーション #clipla_mwed /ruby_on_rails_for_minnano_wedding
matsuhisa
1
900
Rails 移行を支える コードレビュー #finc_mw /support_to_rails_from_code_review
matsuhisa
0
740
爆速のために 独自フレームワーク から Rails に移行した話/mobasif_to_ruby_on_rails
matsuhisa
3
2.8k
デザインレビューにエンジニアも参加してみよう/engineers-join-design-review
matsuhisa
0
320
1年間で起きたデザイナーとエンジニアの変化/1year-designer-engineer
matsuhisa
0
560
サービス改善のために エンジニアがすること、 しないこと
matsuhisa
0
1.8k
Other Decks in Programming
See All in Programming
The free-lunch guide to idea circularity
hollycummins
0
400
年間50登壇、単著出版、雑誌寄稿、Podcast出演、YouTube、CM、カンファレンス主催……全部やってみたので面白さ等を比較してみよう / I’ve tried them all, so let’s compare how interesting they are.
nrslib
4
650
ローカルで稼働するAI エージェントを超えて / beyond-local-ai-agents
gawa
1
230
PHP 7.4でもOpenTelemetryゼロコード計装がしたい! / PHPerKaigi 2026
arthur1
1
460
我々はなぜ「層」を分けるのか〜「関心の分離」と「抽象化」で手に入れる変更に強いシンプルな設計〜 #phperkaigi / PHPerKaigi 2026
shogogg
2
750
仕様漏れ実装漏れをなくすトレーサビリティAI基盤のご紹介
orgachem
PRO
8
4.1k
RailsのValidatesをSwift Macrosで再現してみた
hokuron
0
150
AI時代の脳疲弊と向き合う ~言語学としてのPHP~
sakuraikotone
1
1.8k
今年もTECHSCOREブログを書き続けます!
hiraoku101
0
220
Reactive ❤️ Loom: A Forbidden Love Story
franz1981
2
210
Codexに役割を持たせる 他のAIエージェントと組み合わせる実務Tips
o8n
4
1.5k
Geminiをパートナーに神社DXシステムを個人開発した話(いなめぐDX 開発振り返り)
fujiba
0
130
Featured
See All Featured
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.7k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
240
Bash Introduction
62gerente
615
210k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Building an army of robots
kneath
306
46k
A better future with KSS
kneath
240
18k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
150
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
1.9k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Google's AI Overviews - The New Search
badams
0
950
Principles of Awesome APIs and How to Build Them.
keavy
128
17k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
120
Transcript
3BJMTͰͭ͘Δ ը૾Ξοϓϩʔυ גࣜձࣾΈΜͳͷΣσΟϯά দٱߒ৳
w גࣜձࣾΈΜͳͷΣσΟϯά ΣϒΞϓϦέʔγϣϯΤϯδχΞ w 5XJUUFSɿ!LBNPOFHJ w IUUQXXXqJDLSDPNQIPUPTNBUTVIJTB দٱɹߒ৳
"HFOEB ͖͔͚ͬ ը૾ΞοϓϩʔυͰߟ͑ΔϙΠϯτ 6*͔Βߟ͑Δͷը૾Ξοϓϩʔυ 3BJMTͰը૾ΞοϓϩʔυΛ࡞Δ ·ͱΊ 3BJMTͰͭ͘Δը૾Ξοϓϩʔυ
"HFOEB ͖͔͚ͬ ը૾ΞοϓϩʔυͰߟ͑ΔϙΠϯτ 6*͔Βߟ͑Δͷը૾Ξοϓϩʔυ 3BJMTͰը૾ΞοϓϩʔυΛ࡞Δ ·ͱΊ 3BJMTͰͭ͘Δը૾Ξοϓϩʔυ
͖͔͚ͬ w 1FSMͷಠࣗϑϨʔϜϫʔΫ ʢ.PCB4J'ʣ͔Β3BJMTʹҠߦத w ʮը૾ʯΞοϓϩʔυػೳͷҠߦ ͕ඞཁ w ޱίϛɺඅ༻໌ࡉը૾ɺࣸਅͳ Ͳ
w 3BJMTͰը૾Ξοϓϩʔυͬͯ࡞ͬ ͨ͜ͱ͚͋ͬͨͬʁ αʔϏεͷ3BJMTҠߦͷܭը
͖͔͚ͬ w ՖՇՖʢϢʔβʣ͕ར༻͢Δશը໘ʹର͙ͯ͠Β͍ɻ ը૾͋ΓͷϑΥʔϜɺશը໘ʹର͙ͯ͠Β͍ w ը૾͋ΓͷϑΥʔϜΛ࡞Γͨ͠هԱ͕ͳ͍ʢ͜ͷ͙Β͍ʣ w ը૾͋ΓͷϑΥʔϜΛ৽نͰ࡞ͬͨهԱ͕ͳ͍ ϑΥʔϜΛ࡞Δػձଟ͘ͳ͍
͖͔͚ͬ w 3BJMT͔Βඪ४ʹͳΔHFN w ݄ʹ%))͕ಥʹʜ w ͏ɺ$MPVE4UPSBHFͨΓલͩΑͶɺͱ͍͏ࢥ͍Λײ͡Δ w ฐࣾɺ4ʢ"84ʣΛར༻த w
($1ʢ(PPHMF$MPVE1MBUGPSNʣʹը૾ͷϦαΠζػೳ͕͋Δ͠ɺ ৴OHJOYΛ௨ͯ͠ϦαΠζ͠ͳ͍͍͔ͯ͘͠Εͳ͍ "DUJWF4UPSBHFͷొ
͖͔͚ͬ w ੲ࡞ͬͨͷɺ1$͚ͩͬͨɻεϚʔτϑΥϯͩͱԿ͕՝ͩΖ͏ʁ w ϑΝΠϧ͋ͨΓͷϑΝΠϧ༰ྔɻʙ.#͙Β͍ w ը໘αΠζQYӽ͕͑͋Δ w ωοτϫʔΫճઢͷߟྀɻςετͷ࣌ʹɺ(ճઢͰࢼͯ͠Δʁ w
ՃπʔϧͰՃ͞ΕͨϑΝΠϧΞοϓϩʔυ͞ΕΔ w ʮΠϯελө͑ʯΛૂͬͨࣸਅ૿͍͑ͯͦ͏ εϚʔτϑΥϯ࣌ͷϑΝΠϧΞοϓϩʔυ
͖͔͚ͬ w εϚʔτϑΥϯͰͷը૾ΞοϓϩʔυΛ࡞ͬͨ͜ͱ͕ͳ͍ͷͰΓ͍ͨ w 3BJMTͷγεςϜҠߦ͋ΔͷͰௐ͓͖͍ͯͨ w ࠷ऴతʹɺHFNΛ͏ͱͯ͠ɺͲΜͳࣄ͕ى͖ͯΔ͔Γ͍ͨ w $MPVE4UPSBHFશ෦Ͱͳͯ͘ɺ4ͰͷϑΝΠϧΞοϓϩʔυΛࢼ͠ ͍ͨ
͖͔͚ͬͷ·ͱΊ
͖͔͚ͬ ͖͔͚ͬͷ·ͱΊ Ϗδωεཁ݅ ػձ 3BJMT Ϋϥυ εϚʔτϑΥϯ ࣗͷܦݧෆ ςΫϊϩδʔͷมԽ
"HFOEB ͖͔͚ͬ ը૾ΞοϓϩʔυͰߟ͑ΔϙΠϯτ 6*͔Βߟ͑Δͷը૾Ξοϓϩʔυ 3BJMTͰը૾ΞοϓϩʔυΛ࡞Δ ·ͱΊ 3BJMTͰͭ͘Δը૾Ξοϓϩʔυ
ը૾ΞοϓϩʔυͰߟ͑ΔϙΠϯτ w ը૾ϑΝΠϧͷWBMJEBUF w ը૾ͷछྨɺϑΝΠϧ༰ྔ w ը૾ʹ·ͭΘΔϞσϧͷWBMJEBUF w ը૾ͷઆ໌ςΩετɺλά͚ w
ެ։ɺඇެ։ w ηΩϡϦςΟʔʹؔ͢Δ͜ͱ ը૾Ξοϓϩʔυࣗମ
ը૾ΞοϓϩʔυͰߟ͑ΔϙΠϯτ w Ͳ͏ͬͯࢀরͤ͞Δ͔ʁ w ϦαΠζ͍ͭ͢ΔʁΞοϓϩʔυ࣌ʁࢀরͷ࣌ʁ w Ξοϓϩʔυ࣌ͩͱΞοϓϩʔυͷ͕࣌ؒ૿͑Δ w ࢀরͷ࣌ͩͱճͷϦαΠζͲ͏ͳΔʁ w
ϦαΠζࣗࣾʁαʔϏεΛར༻͢Δʁ w *NBHF'MVYʢ͘͞ΒΠϯλʔωοτʣͳͲ ը૾ͷࢀর
ը૾ΞοϓϩʔυͰߟ͑ΔϙΠϯτ w ࠓ·Ͱ͋ΕαʔϏεӡӦΛ͍ͯ͠Δαʔόʔ্ w ΞϓϦέʔγϣϯαʔόʔͱ͔ʁετϨʔδαʔόʔͱ͔ʁ w ΫϥυετϨʔδΛར༻͢Δ͜ͱ͕૿͑ͨ w "84ɺ($1ɺ"[VSFͳͲ ը૾ϑΝΠϧͷஔ͖ॴ
ը૾ΞοϓϩʔυͰߟ͑ΔϙΠϯτ มΘΒͳ͍ϙΠϯτɺมԽͨ͠ϙΠϯτ ϑΝΠϧ Ξοϓϩʔυ ը૾ͷࢀর Ϋϥυ ετϨʔδ ैདྷͱ͋·ΓมԽͳ͠
"HFOEB ͖͔͚ͬ ը૾ΞοϓϩʔυͰߟ͑ΔϙΠϯτ 6*͔Βߟ͑Δͷը૾Ξοϓϩʔυ 3BJMTͰը૾ΞοϓϩʔυΛ࡞Δ ·ͱΊ 3BJMTͰͭ͘Δը૾Ξοϓϩʔυ
6*͔Βߟ͑Δͷը૾Ξοϓϩʔυ ΫοΫύου
6*͔Βߟ͑Δͷը૾Ξοϓϩʔυ w Ξοϓϩʔυ͢ΔͱϓϨϏϡʔ͞ΕΔ w Ξοϓϩʔυ͠ͳ͕Βೖྗ͕Ͱ͖Δ w ॻ͖͔͚ͰࣗಈͰԼॻ͖ͱͯ͠อଘ͞Ε͍ͯΔɻը૾ɻ w ະެ։ͷϨγϐͷը૾63-͕Θ͔ΕΞΫηεͰ͖Δ ΫοΫύου
6*͔Βߟ͑Δͷը૾Ξοϓϩʔυ FTB
6*͔Βߟ͑Δͷը૾Ξοϓϩʔυ w Ξοϓϩʔυ͞ΕͨΒɺ.BSLEPXOܗࣜͰૠೖ͞ΕΔ w Ξοϓϩʔυ͠ͳ͕Βೖྗ͕Մೳ w ϓϨϏϡʔػೳ͕ผͰ͋ΔͷͰɺͦ͜ͰϓϨϏϡʔʹͳΔ w 1$ͩͱ w
υϥοΫˍυϩοϓͰϑΝΠϧΞοϓϩʔυ͕࢝·Δ w ෳͷϑΝΠϧΛಉ࣌ʹΞοϓϩʔυͰ͖Δ FTB
6*͔Βߟ͑Δͷը૾Ξοϓϩʔυ ؾʹͳͬͨϙΠϯτ ϓϨϏϡʔ υϥοά υϩοϓ ඇಉظ ैདྷͱ͋·ΓมԽͳ͠ ʁ
"HFOEB ͖͔͚ͬ ը૾ΞοϓϩʔυͰߟ͑ΔϙΠϯτ 6*͔Βߟ͑Δͷը૾Ξοϓϩʔυ 3BJMTͰը૾ΞοϓϩʔυΛ࡞Δ ·ͱΊ 3BJMTͰͭ͘Δը૾Ξοϓϩʔυ
3BJMTͰը૾ΞοϓϩʔυΛ࡞Δ w 3BJMT͔Βಋೖ w MPDBMUSVFʹ͠ͳ͍ͱࠓ·ͰͷΑ͏ͳಈ࡞͠ͳ͍ͷͰযͬͨʜ GPSN@XJUI = form_with model: @images,
url: confirm_images_path, local: true do |f| - if @images.errors.any? %h2= "#{pluralize(@images.errors.count, "error")} saved:" %ul - @images.errors.full_messages.each do |message| %li= message
3BJMTͰը૾ΞοϓϩʔυΛ࡞Δ w .BDͰ͋ΕɺCSFXͰΠϯετʔϧՄೳ w ඞཁͳHFNԼهͷ௨Γ )FBEMFTTCSPXTFS brew install chromedriver ChromeDriver
2.31.488774 (7e15618d1bf16df8bf0ecf2914ed1964a387ba0b) group :development, :test do gem 'capybara' gem 'selenium-webdriver' end
3BJMTͰը૾ΞοϓϩʔυΛ࡞Δ )FBEMFTTCSPXTFS require 'capybara' require 'capybara/dsl' require 'selenium-webdriver' Capybara.register_driver :selenium
do |app| Capybara::Selenium::Driver.new(app, browser: :chrome, desired_capabilities: Selenium::WebDriver::Remote::Capabilities.chrome( chrome_options: { args: %w(headless disable-gpu window-size=1680,1050), }, ) ) end
3BJMTͰը૾ΞοϓϩʔυΛ࡞Δ w ͰมΘΒͳ͍ w Ұ෦ͷίϯςϯπͰɺ֬ೝը໘Λແ͕ͨ͘͠ͷมԽͳͦ͞͏ ը໘ભҠ ೖྗ ֬ೝ ྃ
3BJMTͰը૾ΞοϓϩʔυΛ࡞Δ w "DUJPO%JTQBUDI)UUQ6QMPBEFE'JMFͷ͜ͱΛΕ͕ͪ w ςΩετͳͲଘࡏҎ֎ΛΕ͕ͪʜ w 7BMJEBUF͕࣠ʹͳΔ w ը૾ϑΝΠϧࣗମʢϑΝΠϧ༰ྔɺछྨͳͲʣ w
ը૾ͱඥͮ͘ใʢը૾ͷઆ໌ͱ͔ʣ w ϑΥʔϜΦϒδΣΫτͰॲཧ͢Δͱྑͦ͞͏ w ʮGPSNPCKFDUΛͬͯΈΑ͏ϝυϐΞ։ൃऀϒϩάʯʢ!XJMMOFUʣ 4UFQ̍ɿQVCMJDʹը૾Ξοϓϩʔυ
3BJMTͰը૾ΞοϓϩʔυΛ࡞Δ w 4ʹ͍ͭͯΔඞཁ͕͋Δ w ೝূʹ͍ͭͯͷཧղɻDSFEFOUJBMTɺ*".ͳͲ w όέοτࣗମͷΞΫηε੍ޚ w ϋϚΓ·ͨ͠ʜ w
ςετͰΣϒϞοΫʹ͍ͭͯΔඞཁ͕͋Δ w 4ʹςετͰΞοϓϩʔυͨ͘͠ͳ͍ʢͬͯͨʜʣ 4UFQɿ4ʹը૾Ξοϓϩʔυ
3BJMTͰը૾ΞοϓϩʔυΛ࡞Δ w ϑΝΠϧΞοϓϩʔυʹ࣌ؒ ͕͔͔Δؾ͕͢Δ w αʔόʔܦ༝Ͱɺ4Ξοϓ ϩʔυ͍ͯ͠Δ 4UFQɿൃੜʁ IUUQEPDTBXTBNB[PODPNKB@KQ"NB[PO4MBUFTUEFW6TJOH)5511045IUNM
3BJMTͰը૾ΞοϓϩʔυΛ࡞Δ w 4ʹ+BWB4DSJQU͔ΒͰΞοϓϩʔυͰ͖Δํ๏͕͋Δ w ($1"[VSFʹ͋ΔʢΈ͍͚ͨͩΕͲࢼ͍ͯ͠ͳ͍ʣ w ྲྀΕ w +BWB4DSJQUͰɺϑΝΠϧʹ͍ͭͯใΛऔಘ w
αʔόʔଆʹ1PTUͯ͠4ʹඞཁͳҰ࣌తͳೝূใΛฦ͢ w +BWB4DSJQUͰೝূใΛར༻ͯ͠4ʹ1PTU w $BMM#BDLΛར༻ͯ͠ॲཧ 4UFQɿμΠϨΫτΞοϓϩʔυʢ4ʣ
3BJMTͰը૾ΞοϓϩʔυΛ࡞Δ w ͭͷϑΝΠϧΛΞοϓ͢ΔͷͰ͖ͨ w NVMUJQMFΛར༻ͯ͠ΈΔͱɺඇಉظॲཧΛߟ͑Δඞཁ͕ग़ͯ͘Δ w K2VFSZͰ%FGFSSFE1SPNJTFΛ͏ 4UFQɿෳϑΝΠϧͷΞοϓϩʔυ
3BJMTͰը૾ΞοϓϩʔυΛ࡞Δ w ͳͷͰK2VFSZΊͯ&$."4DSJQUʢ&4ʣ͚ͩͰ࣮ w 3FBDUͱ͔7VFͳͲͱͷΈ߹Θͤ͋Δʁ w )5.-͔Β͋Δ'JMF"1*Λ͏ͱʜ w αϜωΠϧ؆୯ʹͰ͖Δ w
1$ͩͱυϥοάˍυϩοϓͰϑΝΠϧΞοϓϩʔυ w -JWF1IPUPTͳͲͷ৽͍͠ը૾ϑΥʔϚοτͷଘࡏ 4UFQɿ&$."4DSJQU'JMF"1*ͳͲ
3BJMTͰը૾ΞοϓϩʔυΛ࡞Δ ٕज़ͷੵΈॏͶͱମݧ 3BJMT 4ͳͲ +BWB4DSJQU &4)5.- (SBQI2-ʁ Ϣʔβମݧ
"HFOEB ͖͔͚ͬ ը૾ΞοϓϩʔυͰߟ͑ΔϙΠϯτ 6*͔Βߟ͑Δͷը૾Ξοϓϩʔυ 3BJMTͰը૾ΞοϓϩʔυΛ࡞Δ ·ͱΊ 3BJMTͰͭ͘Δը૾Ξοϓϩʔυ
3BJMTͰը૾Ξοϓϩʔυ w ʹը૾ΞοϓϩʔυΛ࡞Δͱͨ͠ΒʁΛߟ͑Δͱʜ w Ξοϓϩʔυ͚ͩͳΒ3BJMT ΫϥυετϨʔδͰ࣮ݱՄೳ w Ϣʔβମݧߟ͑Δͱɺ3BJMTҎ֎ͷٕज़͕ࣝඞཁ w 0+5ʹ࠷ద͔ʢ͠Εͳ͍͕ɺҊ͕݅গͳ͍ʣ
w HFNΛར༻͢Δͱͯ͠ɺ࣮Λߟ͑ͯΈΔͱHFNͷબఆ͕มΘΔ͔ ͠Εͳ͍ ·ͱΊ
·ͱΊ w ༥͚ΔσβΠϯ w Σϒ͚ͩ͡Όͳ͘ɺΞϓϦ ؚΊͯߟ͑ΔͱɺΞοϓϩʔ υ͢Δɺͱ͍͏ߦҝ͕ແ͘ͳ Δ ࢀߟॻ੶