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
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
設計次第でAIコードの読む量は減らせる / designing-for-code-reading
minodriven
35
17k
3回つくってわかった、 定期実行ジョブ基盤の本質情報
takai
4
3.2k
エージェントを使い続けるためのメタワーク / Meta-work for keeping using the agent
rkaga
6
1.9k
npm との違いを手がかりにGo の依存管理を理解したい
optim
0
1.1k
オーケストレーション記述言語 Katari
yukikurage
0
200
Agentic Software Factoryに、すごく賢いIF文を。 / super smart IF statement into the Agentic Software Factory.
rkaga
8
2.4k
조합이폭발하는디자인시스템이걸눈으로도테스트하라고요
giljongyu
0
580
コーディング自動化の次へ。人の介入をゼロにするファクトリーとサポートAIによる実践
timakin
5
4.7k
月間100万人のサービス刷新で、 技術選定をHonoに振り切った話
yutobara
8
7k
作って学ぶSpring BootのAuto Configuration / JJUG Night Seminar 2026-10-19
rshindo
0
210
graphql-ruby を Spinel で速くしようとした話
mtsmfm
0
120
APNsからLive Activityを開始する話
yumnumm
0
180
Featured
See All Featured
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
500
Discover your Explorer Soul
emna__ayadi
2
1.3k
4 Signs Your Business is Dying
shpigford
187
23k
Building Flexible Design Systems
yeseniaperezcruz
330
41k
[RailsConf 2023] Rails as a piece of cake
palkan
59
7.1k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.6k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
1
580
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2.1k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
580
Optimising Largest Contentful Paint
csswizardry
37
4k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
2
370
Building Adaptive Systems
keathley
44
3.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 Σϒ͚ͩ͡Όͳ͘ɺΞϓϦ ؚΊͯߟ͑ΔͱɺΞοϓϩʔ υ͢Δɺͱ͍͏ߦҝ͕ແ͘ͳ Δ ࢀߟॻ੶