Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up
for free
Extending Rails for Real World App Development
Akira Matsuda
March 22, 2019
Programming
9
5.6k
Extending Rails for Real World App Development
Rails Developers Meetup 2019 の講演「毎日の開発に役立つRailsプラグインづくりの秘訣」のスライド
https://railsdm.github.io/
#RailsDM
Akira Matsuda
March 22, 2019
Tweet
Share
More Decks by Akira Matsuda
See All by Akira Matsuda
a_matsuda
11
3.5k
a_matsuda
8
23k
a_matsuda
6
1.3k
a_matsuda
5
660
a_matsuda
7
470
a_matsuda
3
79
a_matsuda
25
2.6k
a_matsuda
18
2.9k
a_matsuda
22
7.1k
Other Decks in Programming
See All in Programming
oracle4engineer
0
120
tkow
1
120
sansuke05
1
140
mizotake
2
330
akito0107
0
200
sters
2
140
coa00
2
160
koheisakata
0
170
yotuba088
2
600
shiz
1
110
tooppoo
0
210
makicamel
0
200
Featured
See All Featured
shlominoach
176
7.5k
rmw
11
820
imathis
479
150k
frogandcode
128
20k
aarron
257
36k
bryan
100
11k
searls
204
36k
trishagee
24
2.6k
wjessup
339
16k
colly
188
14k
maggiecrowley
10
510
robhawkes
52
2.8k
Transcript
ຖͷ։ൃʹཱͭ RailsϓϥάΠϯ ͮ͘Γͷൿ݃ @a_matsuda
࠷ॳʹ͓Βͤ 3ͭ
None
RubyKaigiͷLTͷϓϩϙʔβϧडதʂ ໌ޙ·Ͱʂ
RejectKaigiͷϓϩϙʔβϧืूதʂ ࠓ݄͍ͬͺ͍ʂ
None
Asakusa.rb ՖݟΓ·͢ʂ དྷिͷ༵ʂ
ࠓ͢͜ͱ ൺֱత࠷ۙ࡞ͬͨgemͷ ͋Δ͍ ਓͳͥgemΛ࡞Δͷ͔
ࠓ͢͜ͱ ͦΕ͔Βɺ
ࠓ͢͜ͱ ςετίʔυ͕։ൃΛ υϥΠϒ͢Δ
ࠓ͞ͳ͍͜ͱ action_args active_decorator database_rewinder gem_src i18n_generators jb kaminari motorhead rfd
stateful_enum string_template traceroute ...
Question
Կ͔࣮༻ϨϕϧͷgemΛࣗͰ࡞ͬͯ ϦϦʔεͯ͠Έͨ͜ͱ͕͋Δਓ ✋
͍·खΛڍ͛ͯͳ͍ਓͨͪʹ ݴ͍͍ͨ
Why Don't You Create Your Own Gems?
ͳͥgemΛ࡞Βͳ͍ͷ͔ʁ ·ͨɺਓͳͥgemΛ ࡞Δͷ͔ʁ
ͷ߹ɺ΄΅100% ʮݱͷΛղܾ͢ΔͨΊʯ
Case #1
ݱͷ ςετͪΖΜॻ͔ͳͬͪ͘Ό͋ ͍͚ͳ͍ ͰE2Eςετॻ͘ͷΊΜͲ͍ ߲͕૿͖͑ͯͨΓ͢ΔͱͭΒ͍
͖͔͚ͬ
͖͔͚ͬ
͖͔͚ͬ ৽نϓϩδΣΫτΛ࢝ΊΔʹ͋ͨͬͯɺ E2Eςετͱ͔͋Μ·Γॻ͍ͨ͜ͱ ͳ͍͍ͬͯ͏ए͍ϝϯόʔډͨ ୭Ͱςετ͕αΫαΫͬͱॻ͚Δͱ ͍͍ͳ͊ɺͱࢥͬͯ࡞ͬͯΈͨ
heavens_door
͜ͷgemΛ࡞Δʹ͋ͨͬͯ ؾΛ͚ͭͨ͜ͱ ͱʹ͔͘୯ػೳʹ͢Δ
ϒϥβͷૢ࡞Λهͯ͠Capybaraͷ γφϦΦΛ࡞ΔϓϥάΠϯ ͘͢͝ײత
͍ํREADMEʹషͬͨΞχϝgifΛ ݟΕ͙͢Θ͔ΔͷͰɺઆ໌লུ
heavens_door https:/ /github.com/ amatsuda/heavens_door
ͱ͜ΖͰɺ
͝هԱͷํԿ໊͔͍Βͬ͠Όͬͨ Α͏Ͱ͕͢ɺ
࣮ɺ͜ͷίϯηϓτશવ ৽͘͠ͳͯ͘ɺ
Δ͔ੲʹhocus_pocusͰ Ұͬͨ͜ͱͷম͖͠
Case #2
hocus_pocus ྺ࢙ͷڱؒʹຒΕͨΦʔύʔπ ଟػೳͳϒϥβ౷߹։ൃ ڥΈ͍ͨͳͷΛࢦͨ͠
͜ΕɺԿ͔ղܾ͍͕ͨ͋ͬͨ͠ͱ͍͏ΑΓɺ ࡞Εͦ͏ͳؾ͕͔ͨ͠Β࡞Γ࢝ΊͯΈͨɺͱ͍͏ײ͡
hocus_pocusͷߏ main_appʹmount͞Εͨhocus_pocus Τϯδϯ͕͞Βʹ4ͭͷαϒmountable engine Λmountͯ͠Δͱ͍͏ແବʹෳࡶͳߏ ࣌ੈքॳͩͬͨͣͩ͠ɺͨͿΜະͩʹ ͦΜͳengineଞʹແ͍ͷͰͳ͍͔
hocus_pocusͷࢥ "resource missing" driven development ϖʔδʹWikiNameΛॻ͍ͨΒɺ ৽͍͠WikiϖʔδͷϦϯΫʹͳͬͯ͘ ͋ͷײ͡
ͱ͔2019ʹݴͬͯɺ͋Μ·Γ ΘΒͳͦ͏ͳͷͰ
͓Αͦ7ͿΓʹDEMO
7લ
hocus_pocus https:/ /github.com/ amatsuda/hocus_pocus
9લʹ࡞Γ࢝Ίͨͭ ·ͬͨ͘ྲྀߦΒͳ͔ͬͨ ͱ͍͏͔͢Β͠ͳ͔ͬͨ
hocus_pocusͷͦͷޙ େͳߏ৭ʑ͚͋ͬͨͲɺ Δؾ͕࣋ଓͤͣʹdiscon
͏ͪΐ͍͕ߴ͘ͳͬͨΒυΩϡϝϯτ ͱ͔ͪΌΜͱॻ͜͏ɺͱࢥͬͯͨ ͚ͲɺͦΜͳདྷͳ͔ͬͨ
͔͜͜Βಘͨڭ܇ ݱͷυϦϒϯ͡Όͳ͍झຯͷ։ൃϞνϕʔ γϣϯͷҡ͕͍࣋͠ খ͘͞࡞ͬͯૣΊʹϦϦʔεɺ͕ͬͺΓେࣄ υΩϡϝϯςʔγϣϯେࣄ ͍ͦͦํ͕͗͢͠ΔπʔϧͬͯΒ͑ ͳ͍
খ͘͞࡞ͬͯૣΊʹϦϦʔεɺ ͕ͬͺΓେࣄ ࢥ͍͍ͭͨΞΠσΞ͙͢ʹ࣮ Ͱ͖ΔαΠζ͡Όͳ͍ͱɺͳΜ ͔ͩͬͨΕΔ
υΩϡϝϯςʔγϣϯ େ࡞ͳgemυΩϡϝϯτΛॻ͘ োน͕ߴ͍ ͦ͏͍͏ҙຯͰػೳগͳ͍ ΄͏͕ྑ͍
͍ͦͦํ͕͗͢͠Δπʔϧ ͬͯΒ͑ͳ͍ ίϯηϓτ͕ಛघͩͬͨΓ͢Δ ͱɺΘΒͣʹऴΘΔ
hocus_pocusͰͷࣦഊΛ׆͔ͯ͠ heavens_doorͰͬͯΈͨ͜ͱ
Ξχϝgif
Ξχϝgif͍͢͝
ʮݴ༿ʯͰͳ͘ʮ৺ʯͰ ཧղͰ͖Δʂ
Ͱɺ͜ͷϝιου͕ద༻Ͱ͖ΔRuby ͷϥΠϒϥϦͦΜͳʹଟ͘ͳ͍͔ʁ ࣮ࡍɺ͕ࣗ࡞ͬͨଞͷϥΠϒϥϦͰ͜ͷϝιου ͕׆༻Ͱ͖Δ͔Ͳ͏͔ߟ͑ͯΈ͚ͨͲɺ࣮ࡍͳ͔ͳ͔ νϟϯεͳͦ͞͏ ͯͳΘ͚ͰɺRubyͷϥΠϒϥϦΑΓJSͱ͔ͷ ϥΠϒϥϦͷํ͕⭐ΛूΊͦ͢͏ɺ͍ͬͯ͏ ͋ΔΜͩΑͳ͊
ͱ͜ΖͰɺ͜ͷϒϥβͰΞϓϦ Λ։ൃ͍ͯ͘͠ͱ͍͏ίϯηϓτ 2019ʹͳͬͯɺ͋ͷ”conductor”͕ Γ্͕ΓΛݟͤΔػӡ ͜Ε͔Β·ͩ·ͩՄೳੑͷ͋Δ ͳͷͰ
ͦ͜ͰɺϒϥβͰԿ͔͢ΔͭΛ ͏1ͭ
Case #3
ݱͷ ERਤ͕ݟ͍ͨʂ
ݱͰERਤݟ͍ͨͰ͢ΑͶʁ ͨͱ͑ͪΐͬͱΤϯλʔϓϥΠ ζͬΆ͍Ҋ݅ʹ్த͔Βࢀըͨ͠ ࣌ͱ͔
ͦ͜Ͱerd RailsΞϓϦʹmountͯ͠͏ engine ΞϓϦͷERਤΛϒϥβʹදࣔ ͍ͭͰʹૢ࡞
ૢ࡞ʁ create tableͱ͔alter tableͱ͔ migrationΛ࡞ɺ࣮ߦ migrationͷॻ͖ํΛ֮͑ΒΕͳ͍/ࢥ͍ग़ͤͳ͍ ਓʹ͓͢͢Ί migration ͕ʮݴ༿ʯͰͳ͘ʮ৺ʯͰ(ry
DEMO
Status of erd ͥΜͥΜະ UI͕͍Ζ͍ΖϏϛϣʔ ͬͱϒϥογϡΞοϓ͍ͨ͠ؾ࣋ͪ͋Δ͚ͲJSॻ͘ͷ ͠ΜͲ͍ coffeeͰࡶʹॻ͍ͯdecafͨ͠ίʔυ͕ϝϯςෆೳϨϕϧ ୭͔JS͕ಘҙͳํɺॿ͚͍ͯͩ͘͞ʂʂʂʂ(࣮)
erd https:/ /github.com/ amatsuda/erd
ͯ͞ɺมΘͬͯɺϒϥβ্ͰΤϯϓϥ ͬΆ͍ਤΛදࣔ͢ΔengineΛ͏1ͭ
Case #4
ݱͷ ࠓը໘ભҠਤ͕ݟ͍ͨʂ
͜Εݱͷ࣮ͳ routes.rb ΛݟΕϦιʔεͷ ҰཡΘ͔Δ Ͱͭͳ͕Γݟ͑ͳ͍
ͬͺը໘ભҠਤ
ίϯηϓτ ը໘ભҠਤͬͯੲΈΜͳखඳ͖ ͯͨ͠ͷ͚ͩͲɺߟ͑ͯΈͨΒ ͜ΕͬͯੜͰ͖ΔΜ͡Όͳ͍ ͔ʁ
roundabout
DEMO
ͬͯΔ͜ͱ E2EςετͰ࣮ߦ͞Εͨը໘ ભҠΛશͯه ͦͷ݁ՌΛਤࣔ
͜Ε͕ԿΛද͍ͯ͠Δͷ͔ ࣮ࡍʹ࣮͞Εͯͯςετ͞Εͯ ͍Δը໘ભҠΛه ͨͩͷ routes.rb ͷਤࣔͱҧ͏
ςετ͕ͪΌΜͱॻ͔Ε͍ͯΔ͔ͷ ֬ೝʹͳΔ ͋ΔҙຯΧόϨοδͷදࣔͷҰछ ͷΑ͏ͳͷͱݴ͑Δ͔
͜ͷgemͷΑ͞ ॻ͍ͨςετ͕ܗΛม͑ͨࢿ࢈ʹ ͳΔͷ͕Α͍
࣍͏1ͭɺςετࢿ࢈Λ׆͔ͭ͢ Λ͝հ
Case #5
ݱͷ RailsΞοϓάϨʔυͰσάϨ ͨ͘͠ͳ͍
still_life
still_lifeͰͰ͖Δ͜ͱ ςετΛΒͤͨࡍʹɺςετத ʹrender͞ΕͨHTMLΛશ෦ ϑΝΠϧʹॻ͖ग़͢
͍͢͝ྗٕͳϓϥάΠϯ
త ΞϓϦέʔγϣϯίʔυͷॻ͖͑ લޙʹɺϢʔβʔʹಧ͚͍ͯΔͷ ͕มԽ͍ͯ͠ͳ͍͜ͱΛ֬ೝͰ͖Δ
ಛ ը໘Λ౿ΜͰճΔ͚ͩͰྑͯ͘ɺ ΞαʔγϣϯΛॻ͔ͳͯ͘ྑ͍ ͷͰָνϯ
Ͳ͏͍͏࣌ʹ͏ͷ͔ ಛʹRailsͷΞοϓάϨʔυ͕ ఆ༻్ Ұൠతʹ֤छϦϑΝΫλϦϯάͷ ࢧԉʹͳΔͣ
ͦͦͷݩωλ 2011ʹɺΫοΫύουͷRails ͷόʔδϣϯΛ্͛Δ࣌ʹηίϯ ͞Μ͕ॻ͖ࣺͯͨεΫϦϓτ
https:/ /speakerdeck.com/a_matsuda/the-recipe- for-the-worlds-largest-rails-monolith?slide=129
cookpad
·͞ʹݱͷΛత֬ʹղܾ͢Δ ৬ਓٕ
gemԽʹ͋ͨͬͯɺҎԼͷશ໘αϙʔτ ΛՃ Capybara 3 RSpec 3 test-unit minitest
օ͞ΜͷݱͰ͏͖͡ Rails 5.2 -> 6.0 ͷΞοϓάϨʔυۀ͕࢝·Δͱࢥ͍·͕͢ɺ ͔ͳΓ༗༻͔͠Εͳ͍ͷͰɺ Ͳ͏ͧ͝׆༻͍ͩ͘͞
ͱ͜ΖͰɺ͜ͷϥΠϒϥϦͷओͳೳྗ ΞϓϦΛ͜͡։͚ͯಈ࡞Λه͢Δελϯυ ͜ͷೳྗͬͯɺ͜Εͦ͜ "heavens_door" ͡Ό͋Ͷ͔͑ʂ
ͱࢥ͚ͬͨͲɺͦͷ໊લͷgemطʹ औΒΕͯ͠·͍ͬͯͨͷͰ͋ͬͨ
໊લॏཁ gemͷ໊લ͚ͭΔͷ͍͠……
͜ΕΛ8ӽ͠ͰgemԽ͖͔͚ͨͬ͠ ࣗ࡞ςϯϓϨʔτΤϯδϯͷಈ࡞ݕূͷ ͨΊʹཉ͘͠ͳͬͨ ΠϯλʔωοτՈܭͷRailsΞοϓ άϨʔυͷࡍʹ͜ΕͷଘࡏΛࢥ͍ग़ͨ͠
Money Forward
ʮࣗ࡞ςϯϓϨʔτΤϯδϯʯ
Case #6
Himl
Himl ͖͔͚ͬɺӬγεςϜϚωδ ϝϯτͰຖ݄ͬͯΔOSSύον ձ
ͷ͋ͱͷҿΈձ
ӬγεςϜϚωδϝϯτ
kamipo͞Μͷ۪ஒ kamipo: ձࣾͰHamlͬͯΔ͚ͲɺHaml ͱ͔Slimͱ͔จ๏͕Ṗ֮͗ͯ͑͢ΒΕΜ ΘɻERBͰྑ͘ͳ͍ʁ me: ͍ʔɺHaml͍͍ͬ͢ΑɻERBʹ Δͱ͔ϜϦϜϦɻ
͔͠͠ɺ͋ΒͨΊͯɺHamlͷྑͬͯ͞ ͳΜͩΖ͏ʁ ͔֬ʹɺ͋ͷه߸ͨͪΛۦͨ͠จ๏ࣗମ Hamlͷྑ͞ͷຊ࣭Ͱͳ͍͔ Hamlͷྑ͞ɺλάΛػց͕ดͯ͘͡ΕΔ ͓͔͛ͰɺίϯύΠϧ͞ΕͨHTML͕valid ͳ͜ͱ͕อূ͞ΕΔͱ͜Ζ
͡Ό͋ɺHamlͷྑ͞ΛERBʹೖͯ͠ Εྑ͍ͷͰʁ
Αͦ͞͏ɺ͔͠Εͳ͍
ͷͰ࡞ͬͯΈͨ
Himl https:/ /github.com/ amatsuda/himl
ࠓճͷݱ… ਆాͷͱ͋Δډञ
Himlͷ։ൃΛ௨ͯ͡Θ͔ͬͨ͜ͱ
ډञͩͬͯݱͳΜʂ
·ͱΊ
ਓͳͥgemΛ࡞Δͷ͔ʁ Λղͨ͘Ί
ͨ͘͞Μݱʹస͕ͬͯΔ
͜͏͍͏ͷղ͖ํ͍͍Μ͡Ό ͳ͍Ͱ͠ΐ͏͔ʁ ͳ͔ͳָ͔͍͠Ͱ͢Α
Why Don't You Create Your Own Gems? gem࡞Ζʔͥʂ
end
me Name: Akira Matsuda Twitter: @a_matsuda GitHub: amatsuda