Slide 1

Slide 1 text

RailsΞοϓάϨʔυඦܠ by r7kamura

Slide 2

Slide 2 text

ࣗݾ঺հ • Ryo Nakamura • https://github.com/r7kamura • https://twitter.com/r7kamura • ϑϦʔϥϯεͰRailsͷ࢓ࣄΛ΍͍ͬͯ·͢ • Rails 1͔Β6·ͰΞοϓάϨʔυͨ͜͠ͱ͋Γ

Slide 3

Slide 3 text

ࠓ೔࿩͢͜ͱ ʮRailsͬͯ͜͏͍͏ײ͡ͰΞοϓάϨʔυ͍ͯ͘͠ͱ ྑ͍ͷͶʯͱ͍͏ͷ͕෼͔ͬͯ΋Β͑Δͱخ͍͠ • ࣄલ४උ • ΞοϓάϨʔυͷྲྀΕ (Rails 4, 5, 6͕ର৅) • ࣄྫू

Slide 4

Slide 4 text

ࠓ೔࿩͞ͳ͍͜ͱ • Πϯϑϥͷ࿩ (1୆͚ͩΞοϓάϨʔυ͢ΔɺϦΫΤετΛෳ ੡ͯ͠ݕূ؀ڥʹྲྀ͢౳) • ૊৫΍ίϛϡχέʔγϣϯͷ࿩ (ۀ຿ҕୗͰ୲౰͢Δ৔߹ͷ͋ Ε͜ΕɺϨϏϡΞʔׂ౰౳ͷ͋Ε͜Ε) • QAख๏ͷ࿩ (ςετ߲໨ͷબఆํ๏ͳͲ) • ݩʑ͸ΞοϓάϨʔυͷ͸·ΓͲ͜Ζ100બʹ͢Δ༧ఆͩͬͨ

Slide 5

Slide 5 text

ࣄલ४උ

Slide 6

Slide 6 text

࡞ۀલʹ΍͓ͬͯ͘ͱྑ͍͜ͱ • GitHub Issuesͷϥϕϧͷ੔ཧ ← ୔ࢁPRΛग़͢ͷͰ • ςετ΍ݕূ؀ڥͷ੔උ ← Կ౓΋σϓϩΠ͢ΔͷͰ • ։ൃ؀ڥͷ੔උ ← Կ౓΋ςετΛಈ͔͢ͷͰ • CIͷ੔උ ← Կ౓΋ಈ͔͢͜ͱʹͳΔͷͰ • RuboCopͷ੔උ ← ͍Ζ͍Ζॿ͔ΔͷͰ

Slide 7

Slide 7 text

GitHub Issuesͷϥϕϧͷ੔ཧ

Slide 8

Slide 8 text

ςετ΍ݕূ؀ڥͷ੔උ • RailsΞοϓάϨʔυ࣌ʹͦ͜ςετͷ͋Γ͕ͨ͞Λ ௧ײ͢Δ͜ͱʹͳΔ… • Pull Request͝ͱʹݕূ؀ڥ͕༻ҙ͞ΕΔ΍͕ͭ͋Δ ͱຊ౰ʹศར • μϛʔσʔλ͕༻ҙ͞Ε͍ͯΔݕূ؀ڥͩͱϕετ ʢ2ͭҎ্Ϩίʔυ͕͋Δͱࣦഊ͢Δ໰୊ͱ͔͋Δʣ

Slide 9

Slide 9 text

CIͷ੔උ • ߴ଎Խ (ྫ: Performance Pricing PlanରԠ) • ςετͷछྨͷݟ௚͠ (ྫ: db:migration΋ςετ) • ϩάͷݟ௚͠ (ྫ: ςετதͷෆཁͳඪ४ग़ྗ) • ςετ݁Ռͷू໿ (ྫ: CircleCIͷςεταϚϦʔରԠ)

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

RuboCopͷ੔උ • Bundler/Gemfileʹै͓ͬͯ͘ͱޙͷมߋ࡞ۀָ͕ • RailsΧςΰϦͷCop΋༗ޮԽ͓ͯ͘͠ͱḿΔ • ηΩϡϦςΟ΍ύϑΥʔϚϯεͷ໰୊΋ݟͯ͘ΕΔ • ݹ͍APIͷݺͼग़͠Λauto-correctͰ͖Δͷ΋ศར

Slide 13

Slide 13 text

GemfileͰͷఆٛॱংͷ᠘ • গͳ͘ͱ΋rails͸ઌ಄ʹॻ͍͓͍ͯͨํ͕ྑ͍ • ͜͏͍͏ίʔυؚ͕·ΕΔGem͕͋ΔͨΊ if defined?(Rails) … end

Slide 14

Slide 14 text

ΞοϓάϨʔυͷྲྀΕ

Slide 15

Slide 15 text

ΞοϓάϨʔυͷྲྀΕ 1. bundle update 2. ςετͱमਖ਼ 3. master΁ͷऔΓࠐΈ (ਵ࣌σϓϩΠ) 4. όʔδϣϯมߋΛσϓϩΠ 5. ࣄޙॲཧ

Slide 16

Slide 16 text

bundle update • جຊతʹ —conservative ΦϓγϣϯΛ෇͚Δ • bundle update --conservative actionmailer actionpack actionview activemodel activerecord activesupport rails railties Έ͍ͨʹ΍Δ • ґଘgemΛઌʹΞοϓάϨʔυ͠ͳ͍ͱ͍͚ͳ͍έʔε΋͋Δ • devise΍rails-i18nΈ͍ͨʹಉ͡όʔδϣϯͰRails 4 & 5྆ରԠ Ͱ͖ͳ͍gem΋͋ΔͷͰ஫ҙ (͜͏͍͏gem͕ຊ౰ʹ໽հ)

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

ςετͱमਖ਼ 1. ςετ͕ਖ਼ৗʹ࣮ߦ͞ΕΔΑ͏ʹ͢Δ 2. ςετͷࣦഊΛ0݅ʹ͢Δ 3. ܯࠂͷ਺ΛݮΒ͍ͯ͘͠ 4. masterʹมߋ͕͋Ε͹औΓࠐΜͰ1ʹ໭Δ

Slide 19

Slide 19 text

ςετҎ֎Ͱ͓͢͢Ίͷ֬ೝࣄ߲ • rails console ͕ਖ਼ৗʹىಈ͢Δ͔? • Ruby΍CSSͷϑΝΠϧΛฤूͨ͠ͱ͖൓ө͞ΕΔ͔? • Rails.application.eager_load! ͕੒ޭ͢Δ͔? • rails db:rollback db:migration ͕੒ޭ͢Δ͔? • RAILE_ENV=production rails assets:precompile ͕੒ޭ͢Δ͔?

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

master΁ͷऔΓࠐΈ • Ұ౓ʹ୔ࢁมߋ͢Δͱݕূ΋revert΋େมͳͷͰɺ όʔδϣϯมߋ࣌ͷࠩ෼͸࠷খԽ͍ͨ͠ • มߋ͸৽چόʔδϣϯ྆ରԠͳܗͰՃ͑Δ • ςετͷमਖ਼ͱฒߦͯ͠masterʹมߋΛೖΕ͍ͯ͘ (ͷͰ༧Ίcommit͸෼͚͓ͯ͜͏)

Slide 23

Slide 23 text

ࠩ෼Λখ͘͢͞Δ޻෉ • bundle update ͷ —conservative Φϓγϣϯ • rails_kwargs_testing • activerecord-compatible_legacy_migration

Slide 24

Slide 24 text

rails_kwargs_testing • ςετͰͷϝιουҾ਺͕ get “/”, params: { page: “1” } ʹ • RSpecͷϩά͕ܯࠂͰຒΊਚ͘͞Εͯ͠·͏ • 5.0Ҡߦͱಉ࣌ʹೖΕΔͱɺ࡞ۀதʹmasterଆͰςετ͕ॻ ͖׵ΘΔͱconflict͢Δ͠৭ʑେม • 4.2Ͱ΋৽ܗࣜͰॻ͚ΔΑ͏ʹͯ͘͠ΕΔͷ͕͜ͷgem

Slide 25

Slide 25 text

Rails/HttpPositionalArguments • લड़ͷϝιουҾ਺Λݕࠪ͢ΔCop • લճ͸rails5-spec-converterΛ࢖͕ͬͨbuggy… • CopͰauto-correct͢Δͷ͕ྑͦ͞͏

Slide 26

Slide 26 text

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࣌ʹͪΐͬͱܯࠂ͕ ग़ΔΑ͏ʹͳΔ͚͔ͩͩΒɺͦΜͳʹॏཁͰ͸ͳ͍͔΋

Slide 27

Slide 27 text

ࣄྫू

Slide 28

Slide 28 text

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ͷύονόʔδϣϯ͸Ұؾʹ࠷৽·Ͱ্͛Α͏

Slide 29

Slide 29 text

Rails 5ʹͨ͠ΒINSERTͰྫ֎͕… • `created_on` DATE DEFAULT ‘0’ • Rails 5͔ΒσϑΥϧτͰMySQLαʔόଆͷSQLϞʔυ ΋ߟྀ͢ΔΑ͏ʹͳͬͨ • ݁ՌతʹNO_ZERO_DATEͱSTRICT_TRANS_TABLES ͕༗ޮԽ͞ΕͯΤϥʔʹ • Rails 4ͷ಺͔Βݫ͓ͯ͘͘͠͠ͱ٢

Slide 30

Slide 30 text

Rails 5ʹͨ͠Βىಈ࣌ʹྫ֎͕… • ActiveSupport.on_load(:action_controller) { include Foo } • APIϞʔυ࢖ͬͯͳ͍ͷʹ ActionController::API ͕ྫ֎Λ ग़͢Α͏ʹͳͬͨͧ??? • ActiveSupport.on_load(:action_controller) ͸ ActionController::API ͷಡΈࠐΈ࣌ʹ΋ൃՐ͢Δ • Rails 4 ࣌୅ʹ͸૝ఆ͍ͯ͠ͳ͔ͬͨ͜ͱ͕ى͖ͨ

Slide 31

Slide 31 text

Rails 5ʹͨ͠Β404͕204ʹ… • ςϯϓϨʔτ͕ଘࡏ͠ͳ͍ͱ͖ͷڍಈ͕มΘͬͨ • Rails 4ͩͱྫ֎͕ൃੜͯ͠404 • Rails 5ͩͱ204 • ͜͜Ͱʮ͍ͭͰʹϦϑΝΫλϦϯάͯ͠͠·͓͏ʯ ͱ͔΍Γ࢝ΊΔͱຊ౰ʹྑ͘ͳ͍…

Slide 32

Slide 32 text

Rails 5ʹͨ͠ΒControllerͷςετ͕… post “/login”, name: “…”, password: “…” post “/articles”, body: “…” • Rails 5.0 ʹROW_POST_DATA͕Ҿ͖ܧ͕ΕΔෆ۩߹͕ • Rails 5.2 Ͱ͸मਖ਼͞Ε͍ͯΔ͕ 5.0 Ͱ͸ͦͷ·· • ద౰ʹΞϓϦଆͰύον౰͙ͯͯ྇ͷ͕ྑͦ͞͏

Slide 33

Slide 33 text

Rails 5ʹͨ͠ΒparamsपΓͰςετ͕… • get “/foo”, bar: nil, baz: Time.current • Rails 4 ·Ͱ͸ςετͰ౉ͨ͠paramsͱͯ͠౉ͨ͠ΦϒδΣΫ τ͕ControllerͰ௚઀ࢀর͞Ε͍ͯͨ • Rails 5͔Β͸ී௨ʹΤϯίʔυ/σίʔυ͞ΕΔ • ຊདྷ͋Γಘͳ͍৚݅ͷςετ͕େྔʹଘࡏ͍ͯͨ͠ • Content-Type΍paramsͷ಺༰Λࡉ͔͘ݟ௚ͯ͠ରԠ͢Δ

Slide 34

Slide 34 text

Rails 5ʹͨ͠ΒparamsपΓͰྫ֎͕… • ActionController::Parameters͕HashΛܧঝ͠ͳ͘ͳͬͨ (େม͗͢Δ) • ҰԠ5.0Ͱ͸ܯࠂ෇͖ͰHash૬౰ͷϝιου͕ݺͼग़ͤΔ Α͏ʹߟྀ͞Ε͍ͯΔ • ͔͠͠ params.is_a?(Hash) ʹഊ๺ • ͜ͷܧঝݩมߋͷӨڹ͕Rails 5ԽͰҰ൪ා͍

Slide 35

Slide 35 text

Rails 5.1ʹͨ͠ΒparamsपΓͰςετ͕… • get “/”, params: nil ʹͯ͠ΔͱRails 5.1͔Βྫ֎͕ग़Δͧ??? • υΩϡϝϯτΛݟΔݶΓparams͸nilͰ΋ྑͦ͞͏ • Ͳ͏΍ΒRails 5.1ʹ͢Δͱ͖ʹ࣮૷ΛϛεͬͨͬΆ͍ • rails/rails#34737 Λग़ͯ͠mergeࡁΈ • Rails 6 ʹ͔͠ೖΒͳ͍ͷͰ 5 Ͱ͸݁ہ nil Λ౉ͤͳ͍

Slide 36

Slide 36 text

Rails 5.1ʹͨ͠ΒARͷthrough͕… • Rails 5.1͔Β has_many :b, through: a ͕ޮ͔ͳ͍ͧ??? • ௐࠪͨ͠ΒҰ࿈ͷincludeͷதͰ͜͏͍͏͜ͱ͕ى͖͍ͯͨ X.has_many :a X.has_many :b, through: :a X.has_many :a # ← ͜͜Ͱthrough: :aͷఆ͕ٛফ͑Δ

Slide 37

Slide 37 text

Rails 6ʹͨ͠Βvalidation͕… • Rails 6͔Βhas-and-belongs-to-manyͳதؒϨίʔυͰ ఆ͍ٛͯ͠Δvalidation͕ಈ͔ͳ͘ͳͬͨ…? • ࠶ݱίʔυॻ͍ͯTwitterͰΰωͯͨΒkamipo͞Μ͕ rails/rails#35116 Ͱ௚ͯ͘͠Εͨ • ͜ͷޙ΋ผ݅Ͱ࠶ݱίʔυॻ͍ͯ2ʙ3ճΰωͯͨΒ kamipo͞Μ͕શ෦௚ͯ͘͠Εͨ…

Slide 38

Slide 38 text

Rails 6ʹͨ͠Βbelongs_toͷڍಈ͕… • ಉ͡Ϋϥε͔Βಉ͡Ϋϥεʹbelongs_toΛผ໊Ͱఆ ͍ٛͯ͠ΔϞσϧͰɺinverse_of͕ڞ༻͞Εͯ͠·͏ • ࠶ݱՄೳ͕ͩະղܾ • rails/rails#35204 ͰIssueΛཱͯͯௐࠪத

Slide 39

Slide 39 text

Tips1: Contributing to Rails͕ศར • rails/rails΁ͷIssueͷग़͠ํ • Pull Requestͷग़͠ํ • ςετͷಈ͔͠ํ • ࠷খͷ࠶ݱίʔυΛॻ͘ͱ͖ͷςϯϓϨʔτ

Slide 40

Slide 40 text

Tips2: r7kamuraʹؙ౤͛͢Δબ୒ࢶ • ࣮ࡍRailsΞοϓάϨʔυΛ୭͕୲౰͢Δͷ͔ʁ • ਓࣄධՁ΍ݸʑਓͷϞνϕʔγϣϯͷ໰୊͕͋Δ • ୲౰ऀΛ෇͚ͯۀ຿ҕୗͷਓʹؙ౤͛͢Δͱ͍͏ͷ ͸৭ʑߟ͑ΔͱΘΓͱ༗ޮͩͱࢥ͍ͬͯΔ • RailsΞοϓάϨʔυͷ࢓ࣄΛืू͍ͯ͠·͢

Slide 41

Slide 41 text

͓͞Β͍

Slide 42

Slide 42 text

͓͞Β͍ • ࡞ۀͱฒߦͯ͠։ൃج൫Λ੔͍͑ͯ͜͏ • ύονόʔδϣϯ͸Ұؾʹ্͛Α͏ • όʔδϣϯมߋ࣌ͷࠩ෼Λ࠷খԽ͍ͯ͜͠͏ • ᠘͸ଟ͍͕ਅ໘໨ʹςετॻ͍ͯͨΒݕ஌Ͱ͖Δ • Railsଆ͕͓͔͍͠ͳͱࢥͬͨΒ࠶ݱίʔυΛॻ͜͏