Kaigi on Rails 2020 の基調講演「Coming Soon...💎」の発表スライド https://kaigionrails.org/ #kaigionrails
@amatsudaComingSoon...💎@amatsuda
View Slide
ಥવͰ͕͢ɺ
OSSΓ͍ͨʂ🛤Α͍͘ΖΜͳͱ͜ΖͰ૬ஊ͞ΕΔ
͍ΖΜͳͱ͜Ζ🛤Asakusa.rb🛤 ӬγεςϜϚωδϝϯτ͞ΜͷOSSύονձ🛤͍ΖΜͳձࣾ🛤Πϯλʔωοτ
🤔
ʮΓ͍ͨͳΒΕ͍͍ͷͰʁʯ🛤ʮύονΛॻ͘ʯҎ֎ʹΔ͖͜ͱͳ͍🛤ύονΛॻ͘ରͷιϑτΣΞੈͷதʹແʹ͋Δ
🔜
ͨͿΜࠓ͙͢ύονΛॻ͔ͳ͍ཧ༝ٕज़ྗෆͱ͔Ͱͳ͍🛤Έ🛤Ϟνϕʔγϣϯ🛤ετʔϦʔ🛤͖͔͚ͬ
͖͔͚ͬ͞·͟·🛤ࠓɺ͍ΖΜͳϓϩμΫτΛհ͠ͳ͕ΒɺͦΕΛॻ͍͖͔͚ͨͬͦͷͱ͖ߟ͍͑ͯͨ͜ͱͳͲΛ͝հ🛤OSS։ൃʹڵຯ͕͋Δ͚Ͳ࢝Ί͔͕ͨΘ͔Βͳ͍ɺܧଓͰ͖ͳ͍ɺͱ͍͏ํͷࢀߟʹͳΕ
ͱ͍͏ײ͡ͰɺࠓࣗຫΛ ͠ʹདྷ·ͨ͠ʂ🛤ࣗຫͱࣗըࣗࢍ🛤RubyKaigiͰ͍ͭεϐʔΧʔͷօ͞Μʹ͓ئ͍ ͯ͠Δͭ
self🛤name: Akira Matsuda🛤GitHub: @amatsuda🛤Twitter: @a_matsuda
ੈքతʹ༗໊ͳϓϩάϥϚʔ ͡Ί·ͨ͠
ոจॻ
https://jp.quora.com/ϓϩάϥϛϯάʹ͓͍ͯ-ੈքతʹ༗໊ͳຊਓ͍/answers/141576838
https://twitter.com/joker1007/status/1157578882184183808
ͦΜͳ͜ͱͳ͍Ͱ͢ʼʻ🛤 ݺΕΕͲ͜Ͱߦ͘ؾຬʑͳͷʹࠃ͔Β ͥΜͥΜ͔͚ͯΒ͑ͳ͍͚ͩͳΜͰ
Rubyίϛολʔ
Railsίϛολʔ
͔ͤͬ͘ͷୈ1ճKaigi on RailsͳͷͰͪΐͬͱ͚ͩRailsͷ
Railsͱࢲ
ݹגίϯτϦϏϡʔλʔ🛤https://contributors.rubyonrails.org/
https://contributors.rubyonrails.org/
SinceͷཝΛݟΔͱΘ͔Δ
13
͜ͷதͰɺݱͰίϛοτ ͯ͠Δਓ🛤 ҾୀΛද໌ͨ͘͠͠3Ҏ্ίϛοτͯ͠ͳ͍ਓΛফ͜͠ΜͰΈΔ
ݱ
RailsίϛολʔͲΜͲΜਓ͕ ೖΕସΘ͍ͬͯΔ͜ͱ͕Θ͔Δ🛤ྺͷઙ͍ϝϯόʔ͕ͨͪ׆༂͍ͯ͠Δ
RailsϓϩδΣΫτɺଓ͍͍ͯΔΘΓʹɺ͔ͳΓ݈શʹӡӦ͞Ε͍ͯΔͷͰͳ͍͔
RubyRailsͷपลͷ͍Ζ͍Ζ
Asakusa.rbओ࠵ͯ͠·͢
ΦϯϥΠϯͰຖिՐ༵ʹͬͯΔͷͰ͓ؾܰʹ༡ͼʹདྷ͍ͯͩ͘͞
RubyKaigiͷ νʔϑΦʔΨφΠβʔͬͯ·͢
RubyKaigi Takeout 2020͝ࢀՃ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ
RubyKaigi 2021🛤https://rubykaigi.org/2021
Kaigi on Railsͱࢲ
ͳΜ͔RailsͷΠϕϯτΓ͍ͨͬͯݴͬͯΔେ͞ΜΛogijun͞ΜʹҾ͖߹ΘͤͯKaigi on Railsͷ໊લΛݱʹોΒͤͨͷΦϨΦϨ🛤 ͱ͍͏ઌिͷۜ࠲RailsͰ͏ͬͨͷͰলུ
झຯͰΑ͘ύονΛ ॻ͍͍ͯ·͢
ࠓिɺͱ͋Δ͓ࣄͷRailsΞϓϦͷϦϙδτϦͰूܭͯ͠Έͨ݁Ռ🛤Railsຊମ͓ΑͼrailsΦʔΨχθʔγϣϯͰϝϯς͍ͯ͠Δgemͨͪ (16ݸ)🛤͕ࣗ࡞ͬͨͷ (6ݸ)🛤ϝϯςφΛͬͯΔ(= ίϛοτݖΛ͍࣋ͬͯΔ)ͷ (4ݸ)🛤্هҎ֎ͷ͏ͪɺաڈʹ1ͭҎ্Կ͔Λίϛοτͨ͜͠ͱ͕͋Δͷ (86ݸ)🛤ະίϛοτͷͷ (211ݸ)
ΞϓϦͰbundle͍ͯ͠Δgemͷ͏ͪ112/323 ʹԿ͔͠Βίϛοτͯͨ͠🛤3ͷ1ڧ͙Β͍🛤 ͜Μͳײ͡Ͱɺͱʹ͔͍͘ΖΜͳgemΛಡΈॻ͖ ͠·͘ΔελΠϧ
͍ΖΜͳਓ͕ॻ͍͍ͨΖΜͳίʔυΛಡΈॻ͖͢Δͷָ͍͠ͷͰ͓͢͢Ί
ͦͷͨΊʹɺࠒ͔Β͍ΖΜͳίʔυΛಡΈॻ͖͢Δ·ͰͷϋʔυϧΛԼ͓͛ͯ͘ͷ͕େࣄ🛤ಡΈ͍ͨɺͱࢥͬͨ࣍ͷॠؒʹαοͱಡΈ࢝ΊΒΕΔΑ͏ʹ🛤ͦͷͰ͙͢ʹύονΛॻ͖࢝ΊΒΕΔΑ͏ʹ
OSSϥΠϒϥϦͷίʔυΛಡΜͰύονΛॻ͘ϋʔυϧΛԼ͛Δʹ🛤 ·ͣgem-src
💎 gem-src🛤 ͍ΖΜͳgemͷιʔείʔυ͕ϞϦϞϦऩूͰ͖Δͭ🛤gem installίϚϯυΛ֦ுͯ͠ɺΠϯετʔϧͷ͍ͭͰʹgemͷιʔείʔυΛউखʹखݩʹcloneͯ͘͠ΕΔΑ͏ʹ͢Δ
ࠓேɺେ͖ͳػೳՃΛ ͠·ͨ͠
gem-src as a BundlerPlugin!% bundler plugin install gem-src
ࠓ·Ͱࠔ͍ͬͯͨ͜ͱ🛤 ͠Β͘લͷBundlerͷ༷มߋͷ͍ͤͰɺBundlerܦ༝ͰΠϯετʔϧ͞ΕͨgemͰafter-install hook͕Βͳ͘ͳ͍ͬͯͨ
BundlerϓϥάΠϯԽ͢Δ͜ͱͰɺBundlerܦ༝ͰΠϯετʔϧ͞Εͨgemʹgem-src͕ޮ͘Α͏ʹͳͬͨ
RubyGemsϓϥάΠϯ݉ rbenvϓϥάΠϯ݉BundlerϓϥάΠϯ🛤1ϦϙδτϦͰτϦϓϧϓϥάΠϯʂ🛤͜ΜͳϓϩμΫτͨͿΜੈքॳͩͱࢥΘΕΔ🛤 ͱ͍͏͔RubyGemsϓϥάΠϯrbenvϓϥάΠϯBundlerϓϥάΠϯϚΠφʔ͗ͯ͢୭࡞ͬͯͳ͍
ࠓ͔Βɺrbenvͱbundlerͷ྆ํͱʹΈࠐΜͰ͓͘ͷ͕ਪઃఆ% git clone https://github.com/amatsuda/gem-src.git "$(rbenv root)/plugins/gem-src" % bundler plugin install gem-src
ར༻͍ͯ͠Δgemͷιʔείʔυશͯखݩʹ ஔ͍͓͚ͯΔΑ͏ʹͳͬͯɺύονΛൃࣹ͢Δ·ͰͷϦʔυλΠϜ͕ܶతʹॖ·Δ🛤 ͷखݩͰਪఆ2000ݸఔ͕cloneࡁΈͰɺ ͍ͭͰύον͕ॻ͚Δঢ়ଶʹͳ͍ͬͯΔ🛤 ͜Ε͕ແ͍ͱOSS׆ಈ͕Ͱ͖ͳ͘ͳΔ͘Β͍ศར
͜ΕͰࠓ͔Βύον͕ૉૣ͘ॻ͚ΔΑ͏ʹͳΔͣͰ͢
ࠓ͔ΒύονΛͨ͘͞Μ ॻ͍͍͖ͯ·͠ΐ͏
ͦΕ͔Βɺͷ߹ɺଞਓͷϓϩμΫτʹύονΛ͛Δ͚ͩ͡Όͳͯ͘ɺझຯͰΑࣗ͘࡞ͷgemΛ࡞͍ͬͯ·͢
ࣄฑɺओʹʮRailsϓϥΪϯʯ
"Rails Plugin"🛤ࢮޠʁ🛤 ࠷ۙͰ୯ʹ"gem"ͬͯݴΘΕͯΔʁ
gem != Rails Plugin
ͨΓલ͚ͩͲɺੈͷதʹRailsͷ֦ுҎ֎ͷgem͋Δ
💎 rfd
rfd🛤RubyͰ࡞ͬͨFD(ϑΝΠϥʔ)ͷΫϩʔϯ
ݟͲ͜Ζ🛤rfd/commands.rb🛤Կ͔Ωʔ͕ԡ͞ΕΔͱɺͱʹ͔ͦ͘ͷΩʔͷ໊લͷϝιου͕࣮ߦ͞ΕΔ
͖͔͚ͬ🛤 ͜ͷcommands.rbͷΈΛࢥ͍͍ͭͯ͠·ͬͨͷͰ࣮ͯ͠Έͨ͘ͳͬͯ࡞ͬͨ
ϝϯς🛤2ը໘ରԠͱ͔͍ͨ͠ͱࢥ͍ଓ͚ͯؒ์ஔத……🛤։ൃΛखͬͯ͘ΕΔํืूத
gem != Rails Plugin🛤 ࠓٯʹɺgemͰͳ͍Rails pluginͷύλʔϯ
ੲRailsͷ֦ுgem͡Ό ͳ͔ͬͨ
💎 i18n_generators
i18n_generators🛤Rails I18nͷϦιʔεϑΝΠϧΛࣗಈ༁Ͱੜ͠·͘Δͭ🛤͕ॳΊͯࣗͰ࡞ͬͨRails plugin🛤(ͦΕҎલʹଞਓ͕࡞ͬͨͷΛforkͯ͠ϝϯςͱ͔͙ͯͨ͠Β͍)🛤2008🛤GitHubͱ͔Asakusa.rbͱ͔͕Ͱ͖ͨ
First CommitΛݟͯΈΔͱ……🛤https://github.com/amatsuda/i18n_generators/commit/7a9b45c
Installation
gem install ͱ͔ bundle install͡Όͳ͍ʂ🛤 ࣌gem͡Όͳ͔ͬͨ͜ͱ͕Θ͔Δ
Rails pluginͱͯ͠ൺֱతྺ࢙͕ͯͣͬ͘ͱϝϯςͯ͠ΔͷͰ🛤Ruby 1.8ʙ3.0ͷશͯͷόʔδϣϯRubyͰಈ͘🛤Rails 3.0ʙ6.1ͷશͯͷόʔδϣϯRailsͰಈ͘🛤 ݱଘ͢ΔRails I18nؔ࿈ϓϩμΫτͱͯ͠࠷ݹͷͷ͔͠Εͳ͍
࡞͖͔͚ͬͨͬ🛤Rails I18nϓϩδΣΫτʹ࠷ॳ͔ΒؔΘͬͨຊਓͩͬͨ🛤࣌͘ΘΕ͍ͯͨ gettext-rails ͷϦιʔεΛϕʔεʹͯ͠ɺຊମଆͷ ja.yml Λॻ͍ͨ🛤ΞϓϦͷYAMLΩʔͷ໋໊نଇ͕ܾ·ͬͯΔΜ͔ͩΒࣗಈੜͰ͖ΔͷͰʁͱࢥͬͨͷͰͬͯΈͨ🛤Rails I18n͢ΔͳΒ͜͏͍͏ͷ͕ඞਢͰʁͱࢥͬͯ࡞͚ͬͨͲɺ ҙ֎ͱ·Βͳ͔ͬͨ
ٯʹɺ࡞ऀ͕ࢥͬͨҎ্ʹ ·ͬͯ͠·ͬͨͷ
💎 kaminari
kaminari🛤ϖʔδωʔγϣϯ͢Δͭ🛤2011
࡞͖͔͚ͬͨͬ🛤 ࣌σϑΝΫτͩͬͨwill_paginate͕Rails 3ʹ ͳ͔ͳ͔ରԠͯ͘͠Εͳͯ͘ࠔͬͯͨ🛤 ͦͷ͜Ζ࡞ऀͨͪGitHub͍ͬͯ͏ελʔτΞοϓΛۀ͔ͯͯͬͨ͠͠🛤Rails 3ͷ৽ػೳΛ͑ͬͱ͏·͘࡞ΕΔؾ͕ͨ͠
Rails 3ͷ৽ػೳ🛤Active RecordͷϝιουνΣΠϯํࣜͷ৽API🛤Rails Engine
Rails 3ͷ৽ػೳʹ͍ͭͯͷৄ͍͜͠ͱ࣌ WEB+DB Press Vol. 58 ʹॻ͍ͨ🛤 ૯ूฤͷDVDΛങ͑ࠓͰಡΊ·͢
ݱଘ͢ΔதͰੈքͰԿ൪͔ʹݹ͍Rails Engine͔͠Εͳ͍
kaminari͍ͬͯ͏;໊͚ͨ͟લ🛤 ίʔυॻ͚ͨΜ͚ͩͲɺ໊લ͕ܾΊΒΕͳͯ͘ 2ि͙ؒΒ͍ϦϦʔεͰ͖ͳ͔ͬͨ🛤 ౦ژRubyձ͔ٞͳΜ͔Ͱhsbt͞Μʹ͖ͯͱ͏ʹ ܾΊͯΒͬͨ
ڞಉϝϯςφ🛤@yuki24🛤 ࣌Issue͕100ݸͱ͔ཷ·ͬͯΔͷΛݟΔʹݟ͔ͶͯɺAsakusa.rbͷmeetupͰʮख͍·͠ΐ͏͔ʁʯͬͯݴͬͯ͘Εͨ
ͻͲ͍ίʔυ🛤·͍͋Ζ͍Ζྺ࢙తܦҢ͕͋ΔΜͰ͢Α🛤ࠓͱͳͬͯݟͲ͜Ζಛʹͳ͍͠ɺίʔυ৭ʑͻͲ͍ΜͰಛʹಡΉඞཁͳ͍
2011ͭͳ͕Γ🛤2011ʹ࡞ͬͨଞͷgem
💎 action_args
action_args🛤Railsͷίϯτϩʔϥʔ͕MerbΈ͍ͨʹͳΔͭ🛤 ͜ΕφγͰRailsͳΜ͔͑ͳ͘ͳΔ͙Β͍ศརͳͭ
͕ࣗ࡞ͬͨgemͷதͰҰ൪͖ͳ͔ͭ͠Εͳ͍
࡞͖͔͚ͬͨͬ🛤Rails 3ͷίϯτϩʔϥʔͷίʔυ͕ؾʹ৯Θͳ͔͔ͬͨΒ
Rails 2 + Merb = Rails 3🛤 ίϯτϩʔϥʔʹؔͯ͠ɺྑ͘ͳ͍ํͷAPIΛ બͯ͠͠·ͬͨ🛤 ͜͜ͰMerbํࣜΛαϙʔτͰ͖ͳ͔ͬͨͷRailsͷྺ্࢙গͳ͍DHHͷஅϛεͩͱࢥ͏
ݟͲ͜Ζ🛤https://github.com/asakusarb/action_args/commit/895b1ad
"using Refinements in order not toreveal our plugin internal methods"
͜ͷgemͷதͰ͔͠Θͳ͍ϓϥΠϕʔτͳϝιουΛੜͨ͢ΊʹrefinementsΛ׆༻🛤 ͜͜ͰɺActionController::Base ʹϓϥΪϯ෦༻ͷϩδοΫΛՃ͍ͯ͠ΔΜ͚ͩͲɺͦΜͳͷ͕ϢʔβʔͷΞϓϦʹ࿙Εग़ͪ͠Ό͏ͱΧοίѱ͍🛤ͦ͜ͰɺϑΝΠϧείʔϓͳϝιουΛݺͼ͍ͨͱ͜ΖͰ͚ͩੜ͢Α͏ʹ͢Δ
20158݄🛤 ͜ͷίϛοτ͕ߦΘΕͨ20158݄ʹԿ͕͋ͬͨͷ͔ʁ
͖͔͚ͬ @_ksss_ ͞ΜͷπΠʔτ
https://twitter.com/_ksss_/status/631458253688340480
https://twitter.com/a_matsuda/status/631470723974873093
https://twitter.com/_ksss_/status/631478188414144512
https://twitter.com/_ksss_/status/631589269283303424
https://twitter.com/a_matsuda/status/631608168175415296
ͪͳΈʹཌʹRailsʹೖΕͨ🛤https://github.com/rails/rails/commit/571f0f32🛤 ͜Ε͕Rails্࢙ॳrefinements
https://github.com/rails/rails/commit/571f0f32
Refinements🛤 ͓ࣄͷRailsΞϓϦͰ΄ͱΜͲ͍ಓ͕ͳ͍͚ͲɺϥΠϒϥϦϑϨʔϜϫʔΫͷ։ൃʹ͛͢ʔศར
͓ͦΒ͘͜ͷػೳΛ͏·͘͏ͱɺΊͪΌΊͪΌ៉ྷͳϑϨʔϜϫʔΫΛ࡞Δ͜ͱՄೳ͔🛤public APIϝιουҎ֎ϢʔβʔʹԿݟ͑ͯͳ͍Έ͍ͨͳ🛤 ͰRails͍·͞Βແཧ͔ͳ……
ͦΕ͔Βɺ2011ʹ࡞ͬͨͷΛ͏ͻͱͭ
💎 active_decorator
active_decorator🛤͍ΘΏΔσίϨʔλʔ🛤Active Model͕ੜͨ͜͠ͱ͋ͬͯɺPresenterύλʔϯͱ͔ͦ͏͍͏ͷ͕ྲྀߦͯͨ͠🛤Draper͕Ͱ͖ͨͷ͜ͷ͜Ζ
͖͔͚ͬ🛤Draperͷख৮Γ͕͋·ΓʹRubyΒ͘͠ͳͯ͘ ؾ࣋ͪѱ͍ͷͰɺࣗͰͬͱײ৮ͷྑ͍ͷΛ࡞ͬͨ🛤ਖ਼͍͠ઃܭͱਖ਼͍࣮͠Λࢥ͍͍ͭͯ͠·ͬͨ
ਖ਼͍͠ઃܭͱਖ਼͍࣮͠🛤view helperͳΜ͔ͩΒɺhelperͱಉ༷viewͷதͰ ͚ͩ༗ޮʹͳΔ͖ =>🛤 ͋ɺͱ͍͏͜ͱɺview_assigns ͷλΠϛϯάͰҾ͖͠ରͷivarΛObject#extend͢Ε͍͍ͷͰʂ
view_assignsͱ͔;ͭ͏Βͳ͍ͱࢥ͏ΜͰ͚͢Ͳɺ🛤 ͜ͷAPIͷ͕ࣝ͋Δ͔ͳ͍͔͕ɺDraperͱͷ ख৮ΓͷࠩΛੜΜͩ
WEB+DB Press Vol.58ͷಛू1Λॻͨ͘ΊʹRails 3ͷίʔυΛಡΈ·ͬͨ͘ͷ͕࣮݁ͨ͠
ख৮Γ🛤 ;ͭ͏ͷRubyͷϞδϡʔϧΛૉʹ͏͚ͩ🛤ಛघͳجఈΫϥεΛܧঝͱ͔͠ͳ͍🛤͓·͡ͳ͍Λ֮͑ͳͯ͘ྑ͍🛤RubyͷύϫʔΛͦͷ··͏
ࣅͨΑ͏ͳίϯηϓτͷͷΛ ͏1ݸ
💎 jb
jb🛤JSONΛ࡞ΔͨΊͷςϯϓϨʔτΤϯδϯ🛤jbuilder͍ͬͯ͏DSL͕ԚΒ͍ͯ͘͠ํ͕֮͑ ʹ͍ͭ͘ͷalternative
ίϯηϓτ🛤JSONͱRubyͷHash͍͍ͬͯͩͨҰॹͩΑͶ🛤ςϯϓϨʔτͷதͰจࣈྻΛͬͨுͬͨͯ͠JSONͬΆ͍จࣈྻΛΈཱͯΔΜ͡Όͳͯ͘ɺHashͷΠϯελϯεΛ࡞ͬͨΒͦΕΛJSONʹͯ͘͠ΕΔ΄͏͕ײతͩ͠ے͕ྑ͍ͷͰʁ
ઃܭͱ࣮🛤Action ViewͰ1ຕ1ຕͷςϯϓϨʔτ͕ίϯύΠϧ͞Εͨͷ͕ϝιουͱͯ͠ఆٛ͞ΕΔ🛤jbͰίϯύΠϧԿͳͯ͘ɺςϯϓϨʔτʹॻ͍ͨͷ͕ͦͷ···ΔͬͱϝιουbodyʹͳΔ🛤ͦͷϝιου͕HashͷΠϯελϯεΛฦ͢Α͏ʹ͢Ε͍͍͚ͩɻͱʹ͔͘;ͭ͏ͷRubyΛॻ͚ྑ͍
ϝϦοτ🛤 ṖͷDSLΛ֮͑ͳͯ͘ྑ͍🛤Կͯ͠ͳ͍ͷͰ͍🛤jbuilderΑΓϑΝΠϧ໊ͷ֦ுࢠ͕͍
ݟͲ͜Ζ🛤template handlerͷԿͬͯͳͬ͞Γ
lib/jb/handler.rb
handler͕Կͬͯͳ͍ςϯϓϨʔτ ΤϯδϯΛ͏1ݸ
💎 string_template
ݱଘ͢ΔRubyͷςϯϓϨʔτ ΤϯδϯͷதͰӉ࠷
jbͱಉ͡ײ͡ͰɺςϯϓϨʔτ͕ ͦͷ··ϝιουbodyʹͳΔ🛤 ͦ͜Ͱฦͨ͠String͕ͦͷ··HTMLͱ͔ʹͳΔ
ςϯϓϨʔτ͕ΫΦʔτ͞Εͨͷ͕·Δ͝ͱ1ຊͷStringϦςϥϧʹͳΔ🛤 ແବͳbufferΦϒδΣΫτ͕ΘΕͣʹҰܸͰString͕ΈཱͯΒΕΔͷͰੈք࠷
ͨͩͷRubyͳͷͰɺಛघͳຒΊࠐΈ ه๏ͱ͔Ұͳ͍
<%= %> ͱ͔ແͯ͘େৎͳͷʁ
RubyͷStringʹ #{} ͷinterpolation ͕͋ΔΜͰ͢Αʂ🛤͜ΕͰ͚ͬ͜͏ͳΜͱ͔ͳΔ
͍Ͳ͜Ζ🛤layoutϑΝΠϧͱ͔Έ͍ͨͳɺΊͬͪΌrender͞ΕΔ͚Ͳ͋·Γසൟʹ͍͡Βͳ͍Α͏ͳͷ͜ΕͰॻ͍͓ͯ͘ͱύϑΥʔϚϯε͕Ք͛Δ͔
ݟͲ͜Ζ🛤 ͬͺΓtemplate handlerͷԿͬͯͳͬ͞Γ
lib/string_template/handler.rb
Τϯδϯͭͳ͕Γ🛤ΤϯδϯΤϯδϯͰɺࠓςϯϓϨʔτΤϯδϯ͡Όͳͯ͘ Rails Engine
💎 heavens_door
heavens_door🛤 ΈΜͳେ͖Capybaraͷςετίʔυ͕ɺϒϥβͷૢ࡞͔ΒੜͰ͖ΔEngine
໊લ🛤࿐ઌੜͷελϯυ🛤ͳΜ͔ͦΕͬΆ͍ؾ͕ͨ͠Μ͚ͩͲɺ·͋Θ͔Γʹ͔ͬͨ͘Ͱ͢Ͷ
͖͔͚ͬ🛤ZOZOςΫϊϩδʔζ͞Μͷ৽نҊ݅ͰɺΈΜͳͰsystemςετॻ͜͏͍ͥͬͯ͏͜ͱʹͳͬͯ🛤Ͱखॻ͖Ͱ͍͍ͪͪॻ͘ͷେมͩͬͨͷͰ
࣮ϒϥβૢ࡞Ϟʔυ͚ͩ͡Όͳͯ͘ίϚϯυϥΠϯϞʔυ͋ͬͨΓ͢Δ
ίϚϯυϥΠϯϞʔυʁ🛤࡞ͬͨຊਓʹ͔͍͠ํ͕Θ͔Βͳ͍πʔϧʹͳΓͦ͏ͳͷͰ৸͔ͤͯ͋Δ
ઌߦݚڀ🛤 ͜ͷϒϥβ্ͷૢ࡞Λهͯ͠capybaraͷίʔυΛు͘ػೳɺ2010ʹ࡞ͬͨhocus_pocus͍ͬͯ͏Rails Engine pluginͷػೳͱͯ͠طʹ࣮ࡁΈͩͬͨͷ
͜Μͳ;͏ʹxxܦ͔ͬͯΒੲॻ͍ͨίʔυͷժ͕ग़ͨΓ͢Δ͜ͱ͋Δ🛤ίʔυΛॻ͖ଓ͚ͯΔͱΞυόϯςʔδ͕͋ͬͨΓ͢Δɺͱ͍͏ࣄྫ
💎 hocus_pocus
hocus_pocus🛤WikiΈ͍ͨͳײ֮Ͱɺϒϥβ্Ͱૢ࡞ͨ͠Βαʔόʔ্Ͱϖʔδ͕࡞ΕΔRails Engine
࡞Γ࢝Ίͨͷ2010🛤Kaminari͕Engineͱͯ͠૬ݹ͍͖ͬͯͬ͞ݴ͚ͬͨͲɺͦΕΑΓݹ͔ͬͨ🛤͍͢͝Φʔύʔπ͔͠Εͳ͍
͍·͍ͪྲྀߦΒͳ͔ͬͨ……🛤UI͕ϔϘ͗ͨ͢🛤πʔϧࣗମͷ֓೦͕͗ͨ͢͠🛤υΩϡϝϯτ͕ແͩͬͨ🛤Γ͔ͨͬͨ͜ͱͰ͖ͦ͏ʂͬͯࢥͬͨΒͳΜ͔͖ͨ
͍͍ͩͨͰ͖ͨʂ => ͪΌΜͱ͑Δ·Ͱ࡞ΓࠐΉͷ͕ۤख
ίϯηϓτ͕ಛघ͍ͩ͠ํղͰɺ࡞ͬͨຊਓʹ͔͍͠ํ͕Θ͔Βͳ͍πʔϧʹͳͬͯ͠·ͬͨ
͜ͷϓϩμΫτ͕ٴ΅ͨ͠Өڹ🛤Railsඪ४ͷweb-consoleΛΠϯεύΠΞ🛤https://github.com/rails-girls-summer-of-code/summer-of-code-2014/wiki/Project-ideas#conductor-web-based-assistant-for-development
࡞ͬͨߕ൹͋ͬͨΈ͍ͨ🛤 ݁ہweb-consoleͬͯΔ͜ͱͥΜͥΜҧ͏͚Ͳ……
Capybaraؔ࿈ͷϏδϡΞϧܥͷEngineΛ͏1ͭ(͋ͱ͍ͭͰʹݴ͏ͱϓϩάϨۂ໊ͭͳ͕Γ)
💎 roundabout
roundabout🛤ը໘ભҠਤੜπʔϧ
ը໘ભҠਤͷੜ🛤 ࣮ͱͯ͠CapybaraͷϞϯΩʔύον🛤 ςετίʔυதʹCapybaraͰൃੜͨ͠ϦΫΤετͷભҠΛશ෦ه͢Δ🛤͜ΕΛͭͳ͛ͯֆʹ͢Δͱը໘ભҠਤʹͳΔ
͜Μͳײ͡(RedmineϓϩδΣΫτͰ࣮ߦͨ݁͠Ռ)
ਤʹςετ͕ॻ͔Ε͍ͯΔ ͷ͔͠ग़ͯ͜ͳ͍🛤ͭ·Γɺ͋ΔछͷςετΧόϨοδతͳͷ͕ՄࢹԽ͞ΕΔπʔϧͰ͋Δͱݴ͑Δ
ΞΠσΞ͓͠Ζ͍͠ɺϙςϯγϟϧ͋Δؾ͕͢ΔΜ͚ͩͲɺ͋·ΓΘΕͯΔखԠ͑ͳ͍͔🛤͜ΕΛػʹͥͻ͝ར༻͍ͩ͘͞
ΧόϨοδؔ࿈ͭͳ͕ΓͰ
💎 per_file_coverage(unreleased)
per_file_coverage (Ծ)🛤 ςετ࣮ߦ࣌ʹɺΞϓϦΛߏ͢Δ֤ϑΝΠϧ͕ Ͳͷςετ͔Βݺͼग़͞Ε͍ͯΔ͔(ͱɺͦͷٯ)Λ શ෦ચ͍ग़ͯ͠ՄࢹԽ͢Δ
࣮ͱͯ͠SimpleCovͷ ϓϥάΠϯ🛤(ͨͩ͠SimpleCovʹϓϥάΠϯͳͲͱ͍͏֓೦ͳ͍)
ࠈͷϞϯΩʔύον🛤 ͦ͏͍͍͓͑ͪ͏ SimpleCov ͷίϛολʔͰ͋ΔͷͰɺ֦ு͕͍͢͠Α͏ʹϑΟʔυόοΫ͙Β͍͍͖͍ͯͨ͠
RubyͷCoverageϞδϡʔϧΛ ར༻
͖͔͚ͬ🛤ANDPADࣾͷͦͦ͜͜ͷنͷطଘΞϓϦʹࢀըͯ͠ɺʮ͜ͷίʔυͲͷspecϑΝΠϧ͔Βςετ͞ΕͯΔΜͩΖ͏ʁʯͱ͔ɺٯʹʮ͜ͷspecͲ͜ΒΜͷϑΝΠϧΛςετͯ͠ΔΜͩΖ͏ʯͱ͔Γͨ͘ͳͬͨͷͰ
application_controller͚ͩͰ300ݸͱ͔͋ΔͷͰɺͬͺ͜͏͍͏ͷ͕Γͨ͘ͳΔΜͰ͢Α
Ξτϓοτྫ
͔͠͠ɺgem·ͩͳ͍……🛤HTML͕ڊେԽͨ͠߹ͷύϑΥʔϚϯε͕ ͍ͤͯͳ͍🛤໊લ͕ܾ·͍ͬͯͳ͍ʂ
୭໊͔͍͍લΛ͚͍ͭͯͩ͘͞🛤͓ئ͍͠·͢
Coming Soon...💎
࠷ۙͷ͓ࣄؔ࿈Ͱ࡞ͬͨͷΛ͏1ͭ
💎 lightweight_attributes
lightweight_attributes🛤Active RecordͷϞσϧͷΠϯελϯεੜΛۃྗܰ͘͢ΔͨΊͷ͑͛ͭͳ͍ϞϯΩʔύον
ARͷϞσϧͷΠϯελϯεੜ🛤AR 4͙Β͍Ͱೖͬͨtype castingͱ͔͍͏୭ͬͯͳ͍ػೳͷͨΊʹٸܹʹॏͨ͘ͳͬͨ🛤ͱʹ͔͘DB͔ΒϞσϧΛΨόοͱҾͬுͬͯฦ͚ͩ͢Έ͍ͨͳAPIͱ͔ͩͱɺ͕͜͜ϘτϧωοΫʹͳΔ🛤RubyϨϕϧͰɺಛʹTimeతͳͭͷparse͕͔ͬͨΓ͢Δ
RubyͰTimeతͳͭͷparse͕͘ͳΔͱ͍͍ͳ͊🛤https://bugs.ruby-lang.org/issues/16005
https://bugs.ruby-lang.org/issues/16005
ͱ͋Εɺlightweight_attributes ʹ͍ͭͯ
sponsored by ΞΧπΩ🛤 ࠓ͔Βnobuͷύτϩϯʹͳͬͨ͋ͷΞΧπΩࣾͰ͢ʂ
ίʔυ͕͑͛ͭͳ͗ͯ͢͞ ϝϯςෆೳ🛤 ͜ͷΜͷίʔυRailsͷόʔδϣϯ͝ͱʹͥΜͥΜҧͬͯͯɺෳόʔδϣϯରԠͱ͔Ϛδແཧ
ͱ͍͏͜ͱͰɺ·ͱʹϝϯς͞Εͯͳ͍ͷͰར༻ඇਪ
type castingΛԆͤ͞Δͱ͍͏ΞΠσΞ🛤kamipo͞Μ͕͏·͍͜ͱरͬͯActive Record6.1ʹίϛοτͯ͘͠Ε͔ͨΒ͏͓ଂೖΓͰ͍͍͔ͳ……
Rails 6.1
ΞΧπΩ͞ΜεϙϯαʔͰ͏1ͭ
💎 activerecord-ruby(unreleased)🛤 ΞϓϦதͰߋ৽͞Εͳ͍͜ͱ͕લఏͷ͍ΘΏΔ ʮϚελʔσʔλʯΛΠϯϝϞϦʹల։🛤ARͷΦϒδΣΫτͷ··Ωϟογϡ͢Δ🛤readonlyͳͷͰ҆৺͍ͯ͠ճͤΔ
ૂ͍🛤ΫΤϦͷແବଧͪΛ੍🛤ARͷΦϒδΣΫτੜίετΛݮ🛤GCෛՙΛܰݮ
͜͜·ͰͳΒ୭͕ߟ͑ͨ͜ͱ͋Δͱࢥ͏Μ͚ͩͲɺΠϯλʔϑΣΠεͱ࣮͕🛤Model.fetch_from_cache ͱ͔ͦ͏͍͏ײ͡ͷ μα͍ίʔυઈରॻ͖ͨ͘ͳ͍🛤ϓϩμΫγϣϯͷίʔυ;ͭ͏ͷARͷίʔυ͔ΒԿม͑ͣʹɺͰͲͷϞσϧ͕ʮϚελʔςʔϒϧʯ͔͚ͩڭ͑ͯͬͨΒউखʹۭؾΛಡΜͰಈ࡞͢Δ͙Β͍͕͍͍
activerecord-ruby ͷAPI🛤 ʮϚελʔʯͬΆ͍ϞσϧʹҎԼͷΑ͏ͳએݴΛ ೖΕΔclass Country < ActiveRecord::Basefind_by_ruby!end
ͦΕ͚ͩ🛤ଞͷίʔυҰ͍͡Βͳͯ͘ɺҎԼͷΫΤϦ͕ͨͪDBΛݺͼग़͢͜ͱͳ͘దͳΛฦ͢Model.find(id)Model.where(prefecture: 'Tokyo').order(:created_at)
joins͕ೖͬͯͨΓ͢ΔΑ͏ͳෳࡶͳΫΤϦ͕͛ΒΕͨΒDBʹϑΥʔϧόοΫ͢Δ
ϝϞϦ͔Βऔ͖ͬͯͨͷͱDB͔Βऔ͖ͬͯͨͷʹᴥᴪ͕ͳ͍͔Ͳ͏͔ൺֱ͢ΔϞʔυΛࡌ🛤ςετΛ͜ΕͰճ͓ͯ͘͠ͱ҆৺Ͱ͖Δͣ
ύϑΥʔϚϯεήΠϯ🛤ະ🛤ਖ਼ͳͱ͜Ζɺ·ͱͳ࣮ΞϓϦͰͷޮՌݶఆతͳ༧ײ͍ͯ͠Δ🛤DBͷଓ͕ύοπϯύοπϯΈ͍ͨͳڥͰ ޮ͔͘
ݟͲ͜Ζ🛤ARͷΠϯλʔϑΣΠεͱγʔϜϨεʹ࿈ܞ͢ΔͨΊͷςΫχοΫ
࣮ৄࡉ🛤AR͕ΈཱͯͨASTΛSQLͰͳͯ͘Rubyͷ ίʔυʹม͢Δ ToRuby visitor ΛΰϦΰϦ࣮
gem·ͩͳ͍
ࠓ·Ͱʹແ͔ͬͨΞϓϩʔνͩ͠ɺίʔυ͔ͳΓ͓͠Ζ͍ͷͰɺੈʹग़ͨΞΧπΩʹͥͻ͍ͬͯ͡Έ͍ͯͩ͘͞
ઌߦݚڀ🛤arel_ruby
💎 arel_ruby🛤https://github.com/amatsuda/arel_ruby🛤(2012)
ArelͷASTͷRuby visitor🛤ͭ·ΓɺࠓճͷϓϩμΫτͷΤϯδϯ෦ͦͷͷ
͜Ε࣌ɺRDB͔ΒΓͯ͠Rubyͷੈք͚ͩͰΞϓϦͷςετ͕࣮ߦͰ͖ͨΒ͓͠Ζ͍͔ɺͱࢥͬͯͬͯΈͨͷ🛤 ͋·Γݱ࣮తͳϢʔεέʔεͰͳ͔ͬͨͷͰɺ ୯ʹ໘നͦ͏͔ͩΒ࡞ͬͯΈ͚ͨͩΈ͍ͨͳײ͡ʹͳͬͯ͠·ͬͨ🛤ͦͯͣͬ͠ͱ͓ଂೖΓ
ίʔυॻ͚ͯϢʔεέʔεΛݟޡͬͨྫ
8ܦͬͯɺ৽ͨͳϢʔεέʔεΛݟ͚ͭͯ෮׆
·ͱΊ
ͬͺRails🛤RailsΛ͍ͬͺ͍ಡΜͩΓॻ͍ͨΓ͍ͯ͠ΔͱRailsʹৄ͘͠ͳΔ
͍ͭͰͲ͜Ͱૉૣ͘ ύονΛॻ͜͏🛤Railsʹৄ͘͠ͳΔͱɺRails͚ͩ͡Όͳ͍ͯ͘ΖΜͳͷʹύον͕ॻ͚ΔΑ͏ʹͳΔ🛤gem-srcΛrbenvbundlerͱ࿈ܞ͓͍ͤͯͯ͞ɺৗʹ࠷खॱͰύονΛ͚͛ͭΕΔ४උΛ͓͑ͯ͜͏
ͱʹ͔ͨ͘͘͞Μ ύονΛॻ͜͏🛤 ύονΛͨ͘͞Μॻ͔ͳ͍ͱɺύον͕ॻ͚Δ Α͏ʹͳΒͳ͍🛤ྔ͕࣭ʹస͡Δ͜ͱ͋Δ
gem࡞Ոͷಓ🛤͍ΖΜͳͷʹύονΛॻ͍ͯΔͱɺଞਓʹॻ͔ͤΔΑΓࣗͰॻ͍ͨ΄͏͕ྑ͍ͷ͕Ͱ͖Δ͜ͱ͕Θ͔Δ🛤͖͔͚ͬϢʔεέʔεΛ͔ͭ·͑ͯɺϓϩμΫτʹ͍ͯ͜͠͏
ͦΜͳΜ୭Ͱࢥ͍ͭ͘Ͱ͠ΐɺΈ͍ͨͳgemͰͱʹ͔ͬͯ͘ΈΔͱྑ͍🛤ҙ֎ͱ୭Ζ͏ͱͯ͠ͳ͔ͬͨΓɺ͕ࣗੈքͰҰ൪͏·͘ΕͨΓ͢Δ
໊લॏཁ🛤໊લ͚ͭΔͷΉ͍ͣ🛤໊લ͕͚ͭΕͳͯ͘ࠓͷൃදʹؒʹ߹Θͳ͔ͬͨͷ͕͍͔ͭ͋͘ΔͷͰɺ୭͔Ұॹʹ໊લΛߟ͑ͯ΄͍͠……
gemͷख़🛤 ࡞ͬͨgem͙͢ʹժ͕ग़ͳͯ͘ɺޙ͔ΒϢʔεέʔε͕͍͖ͭͯͯɺԿܦ͔ͬͯΒʹཱͬͨΓ͢Δ🛤ͷͰɺͬͺΓΞΠσΞΛ͖ͪΜͱίʔυʹམͱ͓ͯ͘͜͠ͱ͕େࣄ
ϝϯς🛤gemΛ͍ͬͺ͍࡞ͬͨΓͯ͠Δͱɺϝϯςର͕ ૿͑͗ͯ͢ख͕ճΒͳ͘ͳΔ🛤 ͖ͦͦͬΆ͍ਖ਼֬ͳͷͰϝϯςͱ͔ۤख……🛤ͳͷͰɺ୭͔ϝϯςखͬͯ͘ΕΔͱͱͯخ͍͠……
Future Works🛤ࠓޙͱɺԿ͔ϓϩμΫτͷΞΠσΞ͕͖߱ͬͯͨΒɺϲ݄ʹ1ճ͙Β͍ͷϖʔεͰgemΛ࡞Γଓ͚͍ͨ🛤@amatsuda ͷ࣍ճ࡞ʹ͝ظ͍ͩ͘͞ʂ
Coming Soon! 💎
·ͱΊ🛤 গ͠Ͱօ͞Μͷ͜Ε͔ΒͷOSS׆ಈͷώϯτʹͳ͍ͬͯΕ͍Ͱ͢
end🛤name: Akira Matsuda🛤GitHub: @amatsuda🛤Twitter: @a_matsuda