Rails Developers Meetup 2019 の講演「毎日の開発に役立つRailsプラグインづくりの秘訣」のスライド https://railsdm.github.io/ #RailsDM
ຖͷ։ൃʹཱͭRailsϓϥάΠϯ ͮ͘Γͷൿ݃@a_matsuda
View Slide
࠷ॳʹ͓Βͤ3ͭ
RubyKaigiͷLTͷϓϩϙʔβϧडதʂ໌ޙ·Ͱʂ
RejectKaigiͷϓϩϙʔβϧืूதʂࠓ݄͍ͬͺ͍ʂ
Asakusa.rb ՖݟΓ·͢ʂ དྷिͷ༵ʂ
ࠓ͢͜ͱൺֱత࠷ۙ࡞ͬͨgemͷ͋Δ͍ਓͳͥgemΛ࡞Δͷ͔
ࠓ͢͜ͱͦΕ͔Βɺ
ࠓ͢͜ͱςετίʔυ͕։ൃΛ υϥΠϒ͢Δ
ࠓ͞ͳ͍͜ͱaction_argsactive_decoratordatabase_rewindergem_srci18n_generatorsjbkaminarimotorheadrfdstateful_enumstring_templatetraceroute...
Question
Կ͔࣮༻ϨϕϧͷgemΛࣗͰ࡞ͬͯ ϦϦʔεͯ͠Έͨ͜ͱ͕͋Δਓ ✋
͍·खΛڍ͛ͯͳ͍ਓͨͪʹ ݴ͍͍ͨ
Why Don't You Create Your Own Gems?
ͳͥgemΛ࡞Βͳ͍ͷ͔ʁ·ͨɺਓͳͥgemΛ ࡞Δͷ͔ʁ
ͷ߹ɺ΄΅100% ʮݱͷΛղܾ͢ΔͨΊʯ
Case #1
ݱͷςετͪΖΜॻ͔ͳͬͪ͘Ό͋ ͍͚ͳ͍ͰE2Eςετॻ͘ͷΊΜͲ͍߲͕૿͖͑ͯͨΓ͢ΔͱͭΒ͍
͖͔͚ͬ
͖͔͚ͬ৽نϓϩδΣΫτΛ࢝ΊΔʹ͋ͨͬͯɺE2Eςετͱ͔͋Μ·Γॻ͍ͨ͜ͱ ͳ͍͍ͬͯ͏ए͍ϝϯόʔډͨ୭Ͱςετ͕αΫαΫͬͱॻ͚Δͱ ͍͍ͳ͊ɺͱࢥͬͯ࡞ͬͯΈͨ
heavens_door
͜ͷgemΛ࡞Δʹ͋ͨͬͯ ؾΛ͚ͭͨ͜ͱͱʹ͔͘୯ػೳʹ͢Δ
ϒϥβͷૢ࡞Λهͯ͠CapybaraͷγφϦΦΛ࡞ΔϓϥάΠϯ͘͢͝ײత
͍ํREADMEʹషͬͨΞχϝgifΛݟΕ͙͢Θ͔ΔͷͰɺઆ໌লུ
heavens_doorhttps://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" drivendevelopmentϖʔδʹWikiNameΛॻ͍ͨΒɺ ৽͍͠WikiϖʔδͷϦϯΫʹͳͬͯ͘ ͋ͷײ͡
ͱ͔2019ʹݴͬͯɺ͋Μ·Γ ΘΒͳͦ͏ͳͷͰ
͓Αͦ7ͿΓʹDEMO
7લ
hocus_pocushttps://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ਤݟ͍ͨͰ͢ΑͶʁͨͱ͑ͪΐͬͱΤϯλʔϓϥΠζͬΆ͍Ҋ݅ʹ్த͔Βࢀըͨ࣌͠ͱ͔
ͦ͜ͰerdRailsΞϓϦʹmountͯ͠͏engineΞϓϦͷERਤΛϒϥβʹද͍ࣔͭͰʹૢ࡞
ૢ࡞ʁcreate tableͱ͔alter tableͱ͔migrationΛ࡞ɺ࣮ߦmigrationͷॻ͖ํΛ֮͑ΒΕͳ͍/ࢥ͍ग़ͤͳ͍ ਓʹ͓͢͢Ίmigration ͕ʮݴ༿ʯͰͳ͘ʮ৺ʯͰ(ry
DEMO
Status of erdͥΜͥΜະUI͕͍Ζ͍ΖϏϛϣʔͬͱϒϥογϡΞοϓ͍ͨ͠ؾ࣋ͪ͋Δ͚ͲJSॻ͘ͷ ͠ΜͲ͍coffeeͰࡶʹॻ͍ͯdecafͨ͠ίʔυ͕ϝϯςෆೳϨϕϧ୭͔JS͕ಘҙͳํɺॿ͚͍ͯͩ͘͞ʂʂʂʂ(࣮)
erdhttps://github.com/amatsuda/erd
ͯ͞ɺมΘͬͯɺϒϥβ্ͰΤϯϓϥ ͬΆ͍ਤΛදࣔ͢ΔengineΛ͏1ͭ
Case #4
ݱͷࠓը໘ભҠਤ͕ݟ͍ͨʂ
͜Εݱͷ࣮ͳroutes.rb ΛݟΕϦιʔεͷ ҰཡΘ͔ΔͰͭͳ͕Γݟ͑ͳ͍
ͬͺը໘ભҠਤ
ίϯηϓτը໘ભҠਤͬͯੲΈΜͳखඳ͖ͯͨ͠ͷ͚ͩͲɺߟ͑ͯΈͨΒ͜ΕͬͯੜͰ͖ΔΜ͡Όͳ͍͔ʁ
roundabout
ͬͯΔ͜ͱ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 3RSpec 3test-unitminitest
օ͞ΜͷݱͰ͏͖͡ 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ʹೖͯ͠Εྑ͍ͷͰʁ
Αͦ͞͏ɺ͔͠Εͳ͍
ͷͰ࡞ͬͯΈͨ
Himlhttps://github.com/amatsuda/himl
ࠓճͷݱ…ਆాͷͱ͋Δډञ
Himlͷ։ൃΛ௨ͯ͡Θ͔ͬͨ͜ͱ
ډञͩͬͯݱͳΜʂ
·ͱΊ
ਓͳͥgemΛ࡞Δͷ͔ʁΛղͨ͘Ί
ͨ͘͞Μݱʹస͕ͬͯΔ
͜͏͍͏ͷղ͖ํ͍͍Μ͡Όͳ͍Ͱ͠ΐ͏͔ʁͳ͔ͳָ͔͍͠Ͱ͢Α
Why Don't You Create Your OwnGems?gem࡞Ζʔͥʂ
end
meName: Akira MatsudaTwitter: @a_matsudaGitHub: amatsuda