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
0
1.1k
Railsでつくる 画像アップロード 2017 #railsdm /rails_developers_meetup6_image_upload
#railsdm
https://techplay.jp/event/631425
matsuhisa
October 19, 2017
Tweet
Share
More Decks by matsuhisa
See All by matsuhisa
Rails移行のレキシ/mobasif-to-ruby-on-rails2017
matsuhisa
1
1.5k
デザインレビューにエンジニアも参加してみよう/engineers-join-design-review-2017
matsuhisa
0
1k
「ふつう」のRuby on Rails ウェブアプリケーション #clipla_mwed /ruby_on_rails_for_minnano_wedding
matsuhisa
1
840
Rails 移行を支える コードレビュー #finc_mw /support_to_rails_from_code_review
matsuhisa
0
680
爆速のために 独自フレームワーク から Rails に移行した話/mobasif_to_ruby_on_rails
matsuhisa
3
2.7k
デザインレビューにエンジニアも参加してみよう/engineers-join-design-review
matsuhisa
0
260
1年間で起きたデザイナーとエンジニアの変化/1year-designer-engineer
matsuhisa
0
520
サービス改善のために エンジニアがすること、 しないこと
matsuhisa
0
1.7k
Other Decks in Programming
See All in Programming
Vitest Browser Mode への期待 / Vitest Browser Mode
odanado
PRO
2
1.7k
PLoP 2024: The evolution of the microservice architecture pattern language
cer
PRO
0
1.6k
Boost Performance and Developer Productivity with Jakarta EE 11
ivargrimstad
0
850
Vue.js学習の振り返り
hiro_xre
2
130
約9000個の自動テストの 時間を50分->10分に短縮 Flakyテストを1%以下に抑えた話
hatsu38
23
11k
Kaigi on Rails 2024 - Rails APIモードのためのシンプルで効果的なCSRF対策 / kaigionrails-2024-csrf
corocn
5
3.4k
Identifying User Idenity
moro
6
7.9k
Kotlin2でdataクラスの copyメソッドを禁止する/Data class copy function to have the same visibility as constructor
eichisanden
1
140
Macとオーディオ再生 2024/11/02
yusukeito
0
160
CSC305 Lecture 13
javiergs
PRO
0
130
Streams APIとTCPフロー制御 / Web Streams API and TCP flow control
tasshi
1
290
macOS でできる リアルタイム動画像処理
biacco42
7
1.8k
Featured
See All Featured
The Illustrated Children's Guide to Kubernetes
chrisshort
48
48k
A Philosophy of Restraint
colly
203
16k
What's new in Ruby 2.0
geeforr
342
31k
Intergalactic Javascript Robots from Outer Space
tanoku
268
27k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
14
1.9k
Visualization
eitanlees
144
15k
Statistics for Hackers
jakevdp
796
220k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5k
VelocityConf: Rendering Performance Case Studies
addyosmani
325
24k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
41
2.1k
Six Lessons from altMBA
skipperchong
26
3.5k
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 Σϒ͚ͩ͡Όͳ͘ɺΞϓϦ ؚΊͯߟ͑ΔͱɺΞοϓϩʔ υ͢Δɺͱ͍͏ߦҝ͕ແ͘ͳ Δ ࢀߟॻ੶