2019年3月22日にRails Developers Meetup 2019で登壇した際の発表資料です。
RailsΞοϓάϨʔυඦܠby r7kamura
View Slide
ࣗݾհ• Ryo Nakamura• https://github.com/r7kamura• https://twitter.com/r7kamura• ϑϦʔϥϯεͰRailsͷࣄΛ͍ͬͯ·͢• Rails 1͔Β6·ͰΞοϓάϨʔυͨ͜͠ͱ͋Γ
ࠓ͢͜ͱʮRailsͬͯ͜͏͍͏ײ͡ͰΞοϓάϨʔυ͍ͯ͘͠ͱྑ͍ͷͶʯͱ͍͏ͷ͕͔ͬͯΒ͑Δͱخ͍͠• ࣄલ४උ• ΞοϓάϨʔυͷྲྀΕ (Rails 4, 5, 6͕ର)• ࣄྫू
ࠓ͞ͳ͍͜ͱ• Πϯϑϥͷ (1͚ͩΞοϓάϨʔυ͢ΔɺϦΫΤετΛෳͯ͠ݕূڥʹྲྀ͢)• ৫ίϛϡχέʔγϣϯͷ (ۀҕୗͰ୲͢Δ߹ͷ͋Ε͜ΕɺϨϏϡΞʔׂͷ͋Ε͜Ε)• QAख๏ͷ (ςετ߲ͷબఆํ๏ͳͲ)• ݩʑΞοϓάϨʔυͷ·ΓͲ͜Ζ100બʹ͢Δ༧ఆͩͬͨ
ࣄલ४උ
࡞ۀલʹ͓ͬͯ͘ͱྑ͍͜ͱ• GitHub Issuesͷϥϕϧͷཧ ← ࢁPRΛग़͢ͷͰ• ςετݕূڥͷඋ ← ԿσϓϩΠ͢ΔͷͰ• ։ൃڥͷඋ ← ԿςετΛಈ͔͢ͷͰ• CIͷඋ ← Կಈ͔͢͜ͱʹͳΔͷͰ• RuboCopͷඋ ← ͍Ζ͍Ζॿ͔ΔͷͰ
GitHub Issuesͷϥϕϧͷཧ
ςετݕূڥͷඋ• RailsΞοϓάϨʔυ࣌ʹͦ͜ςετͷ͋Γ͕ͨ͞Λ௧ײ͢Δ͜ͱʹͳΔ…• Pull Request͝ͱʹݕূڥ͕༻ҙ͞ΕΔ͕ͭ͋Δͱຊʹศར• μϛʔσʔλ͕༻ҙ͞Ε͍ͯΔݕূڥͩͱϕετʢ2ͭҎ্Ϩίʔυ͕͋Δͱࣦഊ͢Δͱ͔͋Δʣ
CIͷඋ• ߴԽ (ྫ: Performance Pricing PlanରԠ)• ςετͷछྨͷݟ͠ (ྫ: db:migrationςετ)• ϩάͷݟ͠ (ྫ: ςετதͷෆཁͳඪ४ग़ྗ)• ςετ݁Ռͷू (ྫ: CircleCIͷςεταϚϦʔରԠ)
RuboCopͷඋ• Bundler/Gemfileʹै͓ͬͯ͘ͱޙͷมߋ࡞ۀָ͕• RailsΧςΰϦͷCop༗ޮԽ͓ͯ͘͠ͱḿΔ• ηΩϡϦςΟύϑΥʔϚϯεͷݟͯ͘ΕΔ• ݹ͍APIͷݺͼग़͠Λauto-correctͰ͖Δͷศར
GemfileͰͷఆٛॱংͷ᠘• গͳ͘ͱrailsઌ಄ʹॻ͍͓͍ͯͨํ͕ྑ͍• ͜͏͍͏ίʔυؚ͕·ΕΔGem͕͋ΔͨΊif defined?(Rails)…end
ΞοϓάϨʔυͷྲྀΕ
ΞοϓάϨʔυͷྲྀΕ1. bundle update2. ςετͱमਖ਼3. masterͷऔΓࠐΈ (ਵ࣌σϓϩΠ)4. όʔδϣϯมߋΛσϓϩΠ5. ࣄޙॲཧ
bundle update• جຊతʹ —conservative ΦϓγϣϯΛ͚Δ• bundle update --conservative actionmailer actionpackactionview activemodel activerecord activesupport rails railtiesΈ͍ͨʹΔ• ґଘgemΛઌʹΞοϓάϨʔυ͠ͳ͍ͱ͍͚ͳ͍έʔε͋Δ• deviserails-i18nΈ͍ͨʹಉ͡όʔδϣϯͰRails 4 & 5྆ରԠͰ͖ͳ͍gem͋ΔͷͰҙ (͜͏͍͏gem͕ຊʹհ)
ςετͱमਖ਼1. ςετ͕ਖ਼ৗʹ࣮ߦ͞ΕΔΑ͏ʹ͢Δ2. ςετͷࣦഊΛ0݅ʹ͢Δ3. ܯࠂͷΛݮΒ͍ͯ͘͠4. masterʹมߋ͕͋ΕऔΓࠐΜͰ1ʹΔ
ςετҎ֎Ͱ͓͢͢Ίͷ֬ೝࣄ߲• rails console ͕ਖ਼ৗʹىಈ͢Δ͔?• RubyCSSͷϑΝΠϧΛฤूͨ͠ͱ͖ө͞ΕΔ͔?• Rails.application.eager_load! ͕ޭ͢Δ͔?• rails db:rollback db:migration ͕ޭ͢Δ͔?• RAILE_ENV=production rails assets:precompile ͕ޭ͢Δ͔?
masterͷऔΓࠐΈ• Ұʹࢁมߋ͢ΔͱݕূrevertେมͳͷͰɺόʔδϣϯมߋ࣌ͷࠩ࠷খԽ͍ͨ͠• มߋ৽چόʔδϣϯ྆ରԠͳܗͰՃ͑Δ• ςετͷमਖ਼ͱฒߦͯ͠masterʹมߋΛೖΕ͍ͯ͘(ͷͰ༧Ίcommit͚͓ͯ͜͏)
ࠩΛখ͘͢͞Δ• bundle update ͷ —conservative Φϓγϣϯ• rails_kwargs_testing• activerecord-compatible_legacy_migration
rails_kwargs_testing• ςετͰͷϝιουҾ͕ get “/”, params: { page: “1” } ʹ• RSpecͷϩά͕ܯࠂͰຒΊਚ͘͞Εͯ͠·͏• 5.0Ҡߦͱಉ࣌ʹೖΕΔͱɺ࡞ۀதʹmasterଆͰςετ͕ॻ͖ΘΔͱconflict͢Δ͠৭ʑେม• 4.2Ͱ৽ܗࣜͰॻ͚ΔΑ͏ʹͯ͘͠ΕΔͷ͕͜ͷgem
Rails/HttpPositionalArguments• લड़ͷϝιουҾΛݕࠪ͢ΔCop• લճrails5-spec-converterΛ͕ͬͨbuggy…• CopͰauto-correct͢Δͷ͕ྑͦ͞͏
activerecord-compatible_legacy_migration• class Foo < ActiveRecord::Migration[4.2]; end ͷΑ͏ʹόʔδϣϯΛࢦఆ͠ͳ͍ͱ͍͚ͳ͘ͳͬͨ (5.0Ͱܯࠂɺ5.1Ͱྫ֎)• 4.2ͰActiveRecord::Migration[4.2]ͱॻ͚ͳ͍ͷͰɺࣄલʹରԠͰ͖ͣɺόʔδϣϯมߋ࣌ʹ͜ͷରԠಉ࣌ʹؚ·Εͯ͠·͏• 4.2Ͱ5.xͰಈ࡞͢ΔܧঝݩΛఏڙͯ͘͠ΕΔͷ͕͜ͷgem• ※·͋ԿରԠͤͣ5.0ʹͯ͠db:migration࣌ʹͪΐͬͱܯࠂ͕ग़ΔΑ͏ʹͳΔ͚͔ͩͩΒɺͦΜͳʹॏཁͰͳ͍͔
ࣄྫू
Rails 4.2.9ʹͨ͠ΒparamsपΓͰྫ֎͕…• get “/search/:query”, to: “items#search”• Rails 4.2.9ͩͱURIύε͕ASCII-8BITʹͳΔ• Rails 4.2.9ͰյΕͯ4.2.10Ͱͬͨ• RailsͷύονόʔδϣϯҰؾʹ࠷৽·Ͱ্͛Α͏
Rails 5ʹͨ͠ΒINSERTͰྫ֎͕…• `created_on` DATE DEFAULT ‘0’• Rails 5͔ΒσϑΥϧτͰMySQLαʔόଆͷSQLϞʔυߟྀ͢ΔΑ͏ʹͳͬͨ• ݁ՌతʹNO_ZERO_DATEͱSTRICT_TRANS_TABLES͕༗ޮԽ͞ΕͯΤϥʔʹ• Rails 4ͷ͔Βݫ͓ͯ͘͘͠͠ͱ٢
Rails 5ʹͨ͠Βىಈ࣌ʹྫ֎͕…• ActiveSupport.on_load(:action_controller) { include Foo }• APIϞʔυͬͯͳ͍ͷʹ ActionController::API ͕ྫ֎Λग़͢Α͏ʹͳͬͨͧ???• ActiveSupport.on_load(:action_controller) ActionController::API ͷಡΈࠐΈ࣌ʹൃՐ͢Δ• Rails 4 ࣌ʹఆ͍ͯ͠ͳ͔ͬͨ͜ͱ͕ى͖ͨ
Rails 5ʹͨ͠Β404͕204ʹ…• ςϯϓϨʔτ͕ଘࡏ͠ͳ͍ͱ͖ͷڍಈ͕มΘͬͨ• Rails 4ͩͱྫ֎͕ൃੜͯ͠404• Rails 5ͩͱ204• ͜͜Ͱʮ͍ͭͰʹϦϑΝΫλϦϯάͯ͠͠·͓͏ʯͱ͔Γ࢝ΊΔͱຊʹྑ͘ͳ͍…
Rails 5ʹͨ͠ΒControllerͷςετ͕…post “/login”, name: “…”, password: “…”post “/articles”, body: “…”• Rails 5.0 ʹROW_POST_DATA͕Ҿ͖ܧ͕ΕΔෆ۩߹͕• Rails 5.2 Ͱमਖ਼͞Ε͍ͯΔ͕ 5.0 Ͱͦͷ··• దʹΞϓϦଆͰύον͙ͯͯ྇ͷ͕ྑͦ͞͏
Rails 5ʹͨ͠ΒparamsपΓͰςετ͕…• get “/foo”, bar: nil, baz: Time.current• Rails 4 ·ͰςετͰͨ͠paramsͱͯͨ͠͠ΦϒδΣΫτ͕ControllerͰࢀর͞Ε͍ͯͨ• Rails 5͔Βී௨ʹΤϯίʔυ/σίʔυ͞ΕΔ• ຊདྷ͋Γಘͳ͍݅ͷςετ͕େྔʹଘࡏ͍ͯͨ͠• Content-Typeparamsͷ༰Λࡉ͔͘ݟͯ͠ରԠ͢Δ
Rails 5ʹͨ͠ΒparamsपΓͰྫ֎͕…• ActionController::Parameters͕HashΛܧঝ͠ͳ͘ͳͬͨ(େม͗͢Δ)• ҰԠ5.0Ͱܯࠂ͖ͰHash૬ͷϝιου͕ݺͼग़ͤΔΑ͏ʹߟྀ͞Ε͍ͯΔ• ͔͠͠ params.is_a?(Hash) ʹഊ• ͜ͷܧঝݩมߋͷӨڹ͕Rails 5ԽͰҰ൪ා͍
Rails 5.1ʹͨ͠ΒparamsपΓͰςετ͕…• get “/”, params: nil ʹͯ͠ΔͱRails 5.1͔Βྫ֎͕ग़Δͧ???• υΩϡϝϯτΛݟΔݶΓparamsnilͰྑͦ͞͏• Ͳ͏ΒRails 5.1ʹ͢Δͱ͖ʹ࣮ΛϛεͬͨͬΆ͍• rails/rails#34737 Λग़ͯ͠mergeࡁΈ• Rails 6 ʹ͔͠ೖΒͳ͍ͷͰ 5 Ͱ݁ہ nil Λͤͳ͍
Rails 5.1ʹͨ͠ΒARͷthrough͕…• Rails 5.1͔Β has_many :b, through: a ͕ޮ͔ͳ͍ͧ???• ௐࠪͨ͠ΒҰ࿈ͷincludeͷதͰ͜͏͍͏͜ͱ͕ى͖͍ͯͨX.has_many :aX.has_many :b, through: :aX.has_many :a # ← ͜͜Ͱthrough: :aͷఆ͕ٛফ͑Δ
Rails 6ʹͨ͠Βvalidation͕…• Rails 6͔Βhas-and-belongs-to-manyͳதؒϨίʔυͰఆ͍ٛͯ͠Δvalidation͕ಈ͔ͳ͘ͳͬͨ…?• ࠶ݱίʔυॻ͍ͯTwitterͰΰωͯͨΒkamipo͞Μ͕rails/rails#35116 Ͱͯ͘͠Εͨ• ͜ͷޙผ݅Ͱ࠶ݱίʔυॻ͍ͯ2ʙ3ճΰωͯͨΒkamipo͞Μ͕શ෦ͯ͘͠Εͨ…
Rails 6ʹͨ͠Βbelongs_toͷڍಈ͕…• ಉ͡Ϋϥε͔Βಉ͡Ϋϥεʹbelongs_toΛผ໊Ͱఆ͍ٛͯ͠ΔϞσϧͰɺinverse_of͕ڞ༻͞Εͯ͠·͏• ࠶ݱՄೳ͕ͩະղܾ• rails/rails#35204 ͰIssueΛཱͯͯௐࠪத
Tips1: Contributing to Rails͕ศར• rails/railsͷIssueͷग़͠ํ• Pull Requestͷग़͠ํ• ςετͷಈ͔͠ํ• ࠷খͷ࠶ݱίʔυΛॻ͘ͱ͖ͷςϯϓϨʔτ
Tips2: r7kamuraʹؙ͛͢Δબࢶ• ࣮ࡍRailsΞοϓάϨʔυΛ୭͕୲͢Δͷ͔ʁ• ਓࣄධՁݸʑਓͷϞνϕʔγϣϯͷ͕͋Δ• ୲ऀΛ͚ͯۀҕୗͷਓʹؙ͛͢Δͱ͍͏ͷ৭ʑߟ͑ΔͱΘΓͱ༗ޮͩͱࢥ͍ͬͯΔ• RailsΞοϓάϨʔυͷࣄΛืू͍ͯ͠·͢
͓͞Β͍
͓͞Β͍• ࡞ۀͱฒߦͯ͠։ൃج൫Λ͍͑ͯ͜͏• ύονόʔδϣϯҰؾʹ্͛Α͏• όʔδϣϯมߋ࣌ͷࠩΛ࠷খԽ͍ͯ͜͠͏• ᠘ଟ͍͕ਅ໘ʹςετॻ͍ͯͨΒݕͰ͖Δ• Railsଆ͕͓͔͍͠ͳͱࢥͬͨΒ࠶ݱίʔυΛॻ͜͏