Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Railsでつくる 画像アップロード 2017 #railsdm /rails_develop...
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
matsuhisa
October 19, 2017
Programming
1.3k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
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
920
Rails 移行を支える コードレビュー #finc_mw /support_to_rails_from_code_review
matsuhisa
0
760
爆速のために 独自フレームワーク から Rails に移行した話/mobasif_to_ruby_on_rails
matsuhisa
3
2.9k
デザインレビューにエンジニアも参加してみよう/engineers-join-design-review
matsuhisa
0
340
1年間で起きたデザイナーとエンジニアの変化/1year-designer-engineer
matsuhisa
0
570
サービス改善のために エンジニアがすること、 しないこと
matsuhisa
0
1.8k
Other Decks in Programming
See All in Programming
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Rails World 2026, Austin, Texas
marcoroth
0
190
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
440
setup-vp GitLab対応の裏側
naokihaba
0
150
すこし踏み込む CancellationToken
htkym
2
1.6k
MVNOの申込からeSIM開通までをiOSアプリでつなぐ- 本人確認・MNP・通信事業者基盤をまたぐ実装
satotakeshi
0
540
JAWS-UG 東京支部が始める、JAWS-UG支部コラボ / JAWS-UG lunchtime LT Collaboration
y0hgi
0
180
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
1.1k
phperだってパンチカードでコーディングしたい
o0h
PRO
0
200
コードレビューのボトルネックを"する側"と"される側"の両面から解消する
yub0n
2
1.5k
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
550
KiroのSpecで「五目並べ」を作ってみる
satoshi256kbyte
1
350
SREの越境 / SRE Collaboration
y0hgi
2
300
Featured
See All Featured
Facilitating Awesome Meetings
lara
57
7.2k
How to Think Like a Performance Engineer
csswizardry
28
2.9k
How to build a perfect <img>
jonoalderson
1
6.1k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
4
1.2k
The SEO identity crisis: Don't let AI make you average
varn
0
580
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
970
brightonSEO & MeasureFest 2025 - Winning Strategies for Black Friday CRO & PPC - Christian Goodrich
cargoodrich
3
860
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
210
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
260
Exploring anti-patterns in Rails
aemeredith
4
520
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
520
Become a Pro
speakerdeck
PRO
31
6.3k
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 Σϒ͚ͩ͡Όͳ͘ɺΞϓϦ ؚΊͯߟ͑ΔͱɺΞοϓϩʔ υ͢Δɺͱ͍͏ߦҝ͕ແ͘ͳ Δ ࢀߟॻ੶