$30 off During Our Annual Pro Sale. View Details »

Simplicity on Rails -- RDB, REST and Ruby

Simplicity on Rails -- RDB, REST and Ruby

Kaigi on Rails 2023の登壇資料です。

https://kaigionrails.org/2023/talks/moro/

実世界のRailsアプリケーションをシンプルに保つための方法を、Railsが提供する機能群をもとに考察します。

実世界の、特に仕事で開発するRailsアプリへの要求は様々のものがあり、Railsの豊富な機能群をもっても日々苦労して開発しているかと思います。 そんな中でも、Railsが得意とするような設計に落とし込むことで、複雑な要求をシンプルな実装で実現できると感じています。

本講演では、Railsが提供する機能のうち、「RDB」「REST」「Ruby」という要素を軸に、実世界の要求をシンプルに実装するための考え方を紹介します。

MOROHASHI Kyosuke

October 27, 2023
Tweet

More Decks by MOROHASHI Kyosuke

Other Decks in Programming

Transcript

  1. 4JNQMJDJUZPO3BJMT
    ɹ3%#
    ɹ3&45

    ɹ3VCZ

    ,BJHJPO3BJMT
    ॾڮګհ!NPSP

    View Slide

  2. ,ZPTVLF
    .030)"4)*
    !NPSP

    View Slide

  3. View Slide

  4. 4JNQMJDJUZPO3BJMT
    ɹ3%#
    ɹ3&45

    ɹ3VCZ

    View Slide

  5. 3BJMTʹ͓͚Δγϯϓϧ͞
    w αʔϏεͰ΍Γ͍ͨ͜ͱͱɺهड़͢Δίʔυͷ͕ࠩ

    গͳ͍ঢ়ଶ͕γϯϓϧ
    w ؆୯ͳ͜ͱΛ؆୯ʹɺ೉͍͜͠ͱ΋ͦΕͳΓʹ
    w ͍ΘΏΔίʔυ্ͷʮۮൃతͳෳࡶ͞ʯ͕গͳ͍ঢ়ଶΛ໨ࢦ͢

    View Slide

  6. 3BJMT͸ෳࡶ͞ΛݮΒͯ͘͠ΕΔ
    w 3BJMT͸8FCΞϓϦͷۮൃతͳෳࡶ͞ΛݮΒͯ͘͠ΕΔ
    w 8FCͷϦΫΤετΛΞϓϦέʔγϣϯίʔυʹϧʔςΟϯά͢Δɺͱ͔
    w ఆܕతͳ%#ΞΫηε͔Β݁ՌηοτΛΦϒδΣΫτԽ͢Δɺͱ͔
    w ͦͷޮՌΛ࠷େݶಘΔͨΊʹ3BJMT͕ಘҙͱ͢ΔΑ͏ͳઃܭʹԊ͏
    IUUQTSVCZPOSBJMTPSH

    View Slide

  7. 3BJMT͕ಘҙͱ͢ΔΑ͏ͳઃܭŪŰ
    w ΍͸ΓTDBGGPME͕ώϯτʹͳΔ
    w %#ͷςʔϒϧߏ଄ͱɺը໘ͷߏ଄ɺಛʹೖྗ୯ҐΛ

    ߹Θͤͯɺ$36%͢Δ

    View Slide

  8. TDBGGPMEͷΑ͏ʹ$36%
    w ;ͭ͏ͷαʔϏε͸ը໘%#Ͱ͸ͳ͍͠ɺ$36%Ͱ͸
    ػೳ͕଍Γͳ͍ͷͰ͸ͳ͍͔
    w ͦΕ͸ͦ͏
    w ͦ͜ΛຒΊͯγϯϓϧʹ͢Δࢹ఺Λ঺հ͍ͨ͠Ͱ͢

    View Slide

  9. 4JNQMJDJUZPO3BJMT
    ɹ3%#
    ɹ3&45

    ɹ3VCZ

    View Slide

  10. %#ઃܭʹ͓͚Δ

    ΠϕϯτΤϯςΟςΟΛݟग़͢

    View Slide

  11. 4JNQMJDJUZPO3BJMT
    ɹ3%#
    ɹ3&45

    ɹ3VCZ
    w υϝΠϯʹݱΕΔΠϕϯτΤϯςΟςΟΛ
    ݟग़͢
    w ͦΕΛAIBT@NBOZUISPVHIAؔ࿈ͷ

    ΤϯςΟςΟʹ͢Δ

    View Slide

  12. “ • :
    • 時 存在 、存在 <登録>
    •名前 持 。
    • 扱 「時」 扱 「時」 違 、 瞬間 刻印 、

    有効 存在 期間 表現 。
    • :
    •繰 返 ⾏ ⾏為。 時起 <記録>
    •例) ⼊荷、発注、etc
    •時刻 ( ) 持 。
    •多 場合、 使 ⾏
    •名前 ( ⾃体 ⾏為 名前 ) 持
    %#ઃܭษڧձ
    λϫʔζΫΤετࣾ࿨ాলೋ͞ΜΛઌੜʹΉ͔͑ͨษڧձͷϝϞ

    IUUQTHJTUHJUIVCDPNTVOBPU

    View Slide

  13. ྫ,BJHJͷΤϯςΟςΟ
    conferences
    id
    name
    location
    start_at
    end_at
    *timestamps
    users
    id
    name
    *timestamps
    registrations
    id
    conference_id
    user_id
    *timestamps

    View Slide

  14. ,BJHJͷϦιʔεΤϯςΟςΟ
    w ΠϕϯτࢀՃొ࿥αʔϏεΛ૝ఆ͢Δ
    w DPOGFSFODFTͱVTFSTͱ͍͏ϦιʔεΤϯςΟςΟ͕͋Γɺଟରଟͷؔ܎ʹͳΔ
    w Ϣʔβʔ͸ɺෳ਺ͷΧϯϑΝϨϯεʹࢀՃͰ͖Δ
    w ΧϯϑΝϨϯε͸ɺෳ਺ͷϢʔβʔ͕ࢀՃͰ͖Δ
    w 3%#ͰଟରଟΛදݱ͢Δʹ͸ɺ྆ऀΛࢀর͢ΔΤϯςΟςΟΛಋೖ͢Δ
    conferences
    id
    name
    location
    start_at
    end_at
    *timestamps
    users
    id
    name
    *timestamps

    View Slide


  15. ⾃体 独⽴

    扱 場合 、中間 join 使 has_many :through

    設定 。


    何 特別 必要

    場合 、join 不要 has_and_belongs_to_many

    使 ⽅ 。
    3BJMTΨΠυ"DUJWF3FDPSEͷؔ࿈෇͚

    IBT@NBOZUISPVHIͱIBT@BOE@CFMPOHT@UP@NBOZͷͲͪΒΛબͿ͔
    IUUQTSBJMTHVJEFTKQBTTPDJBUJPO@CBTJDTIUNM

    View Slide

  16. ϦϨʔγϣϯγοϓϞσϧࣗମΛ

    ಠཱͨ͠ΤϯςΟςΟͱͯ͠ѻ͍͍ͨ
    w ΠϕϯτΤϯςΟςΟΛݟग़͢͜ͱɺͦΕΛIBT@NBOZUISPVHIͰ

    ࢖͏͜ͱ͕ɺશମͷγϯϓϧ͞Λอͭͷʹ໾ཱͪ·͢
    w ʮϦϨʔγϣϯγοϓϞσϧͰԿ͔ಛผͳ͜ͱΛ͢Δඞཁ͕·ͬͨ͘ͳ͍
    ৔߹ʯ͸͘͝গͳ͍
    w ϦιʔεΤϯςΟςΟͰଟରଟΛදݱ͢Δ͚ͩͳΒ͋Δ͔΋͠Εͳ͍͚Ͳʜ
    w ޙड़͢ΔUISPVHIͷػೳڧԽ΋͋Γɺগͳ͘ͱ΋࿩ऀ͸͜͜਺೥·ͬͨ͘IBCUNΛ࢖ͬͯ·ͤΜͶ

    View Slide

  17. 3BJMTͷؾ࣋ͪʹͳͬͯߟ͑Δ
    w ࠷ॳͷ࠷ॳ͸IBCUN͜ͱIBT@BOE@CFMPOHT@UP@NBOZؔ࿈͚͕ͩ͋ͬͨ
    w 3BJMTͷஈ֊ͰɺIBT@NBOZUISPVHI͕௥Ճ͞Εͨ
    w ͦͷ͋ͱ΋ɺIBT@POFUISPVHI΍CFMPOHT@UPUISPVHIͳͲɺ

    UISPVHI଒ོ͕੝ΛۃΊ͍ͯΔ
    w υϝΠϯͷදݱͱͯ͠༏Ε͍ͯΔ ͖ΐ͏͸ͬͪ͜ͷ࿩

    w ػೳతʹ΋UISPVHIͷUISPVHIͳͲͰؔ࿈Λ୧ΕΔͷ͕ͪΐ͏ศར͡Όͳ͍Ͱ͔͢ "3εΰΠ

    View Slide

  18. ΠϕϯτΤϯςΟςΟΛݟग़ͯ͠ɺ࢖͏
    w ΠϕϯτΤϯςΟςΟΛݟग़͠ɺUISPVHIͰࢦఆͯ͠ଟରଟͷؔ܎Λ࡞Δ
    w ࣮ੈքͷαʔϏεͰ͸ɺ͜ͷΠϕϯτΤϯςΟςΟ͕Ͱ͖Δ͜ͱ͕ɺ

    ॏཁͳίϯόʔδϣϯϙΠϯτʹͳ͍ͬͯΔ͜ͱ΋ଟ͍
    w ྫΧϯϑΝϨϯεࢀՃొ࿥αΠτʹ͓͚Δʮొ࿥ʯ
    w ΧϯϑΝϨϯεͱϢʔβʔ͸ɺ୯ʹଟରଟͳͷͰͳ͘ʮొ࿥͍ͯ͠Δʯؔ܎͕͋Δͷͩ
    w ͦͯͦ͠ͷׂʹɺ׳Εͳ͍ͱൃݟͮ͠Β͍
    w ࿩ऀ͸ɺӋੜষ༸ʮָʑ&3%Ϩοεϯʯ ᠳӭࣾ
    Ͱֶͼ·ͨ͠ɻIUUQTXXXTFTIPQDPNQSPEVDUEFUBJM

    View Slide

  19. ొ࿥ͨ͠ίτSFHJTUSBUJPOT
    w 6TFS͕$POGFSFODFʹࢀՃొ࿥ͨ͠ίτɺΛΠϕϯτΤϯςΟςΟͱͯ͠

    ه࿥͢Δɻ͜ͷ৔߹SFHJTUSBUJPOͳͲ
    w ͜Ε͕IBT@NBOZUISPVHIͰࢦఆ͢ΔςʔϒϧʹͳΔɻ
    w IBCUNͷதؒςʔϒϧͱҧͬͯJEΛ࣋ͭΤϯςΟςΟͱͯ͠ѻ͏
    conferences
    id
    name
    location
    start_at
    end_at
    *timestamps
    users
    id
    name
    *timestamps
    registrations
    id
    conference_id
    user_id
    *timestamps

    View Slide

  20. ొ࿥ͨ͠ίτSFHJTUSBUJPOT
    class User < ApplicationRecord


    has_many :registrations


    has_many :conferences, through: :registrations


    end


    class Registration < ApplicationRecord


    belongs_to :user


    belongs_to :conference


    end
    conferences
    id
    name
    location
    start_at
    end_at
    *timestamps
    users
    id
    name
    *timestamps
    registrations
    id
    conference_id
    user_id
    *timestamps

    View Slide

  21. ΠϕϯτΤϯςΟςΟΛݟग़͢ͱͰ͖Δ͜ͱ
    UserMailer.registration_accepted(@user, @conference, at: Time.current).deliver_later


    # => #{@user.name}༷ɺ#{I18n.l(at)}ʹ#{@conference}΁ͷࢀՃΛड͚෇͚·ͨ͠


    UserMailer.registration_accepted(@registration).deliver_later
    w SFHJTUSBUJPOΛݟग़͍ͯ͠ͳ͍৔߹ɺ!VTFSͱ!DPOGFSFODF΍ɺλΠϜελϯϓΛݸผʹ࣋ͪճΔඞཁ͕͋Δ
    w !VTFS͸΄Μͱʹ!DPOGFSFODFొ࿥͍ͯ͠Δ ࠶νΣοΫͨ͘͠ͳΒͳ͍
    w λΠϜελϯϓ΄ΜͱʹDVSSFOUͰ͍͍ ϦτϥΠ͢Δͱ͖Ͳ͏͢Δ
    w SFHJTUSBUJPO͕͋Ε͹ɺʮొ࿥ͨ͠ίτʯΛίʔυ্Ͱͦͷ··औΓճͤΔ
    w VTFSͱDPOGFSFODFΛ୧ΕΔɻ྆ऀΛ୧ΕΔ͜ͱ͸ɺ%#ͷࢀর੔߹ੑ੍໿Ͱ΋ࢧ͑ΒΕΔ
    w SFHJTUSBUJPOTDSFBUFE@BUΛొ࿥೔࣌ͱΈͳͤΔ
    υϝΠϯͰେࣄͳʮొ࿥ͨ͠ίτʯΛίʔυ্ʹදݱͰ͖Δ

    View Slide

  22. ଓΠϕϯτΤϯςΟςΟΛݟग़͢ͱͰ͖Δ͜ͱ
    w SFHJTUSBUJPOTʹΧϥϜΛ௥Ճͯ͠ɺ෇Ճ৘ใΛ΋ͨͤΒΕΔ
    w ొ࿥൪߸ͱ͔ɺొ࿥࣌ͷਃ͠ૹΓAOPUFAͱ͔ɺొ࿥छผ ݱ஍ࢀՃYPSΦϯϥΠϯࢀՃ
    ͱ͔
    w ޙଓΠϕϯτͷ਌ϨίʔυʹͳΕΔ
    w ྫࢀՃඅ༻Λܾࡁͨ͠ίτQBZNFOUT ౰೔ʹࢀՃͨ͠ίτBUUFOEBODFTͳͲ
    w ACFMPOHT@UPSFHJTUSBUJPOAͳ"3ϞσϧͱͳΔ
    w ొ࿥ͨ͜͠ͱࣗମΛه࿥Ͱ͖Δ
    w ؂ࠪϩάʹ࢒ͨ͠Γɺίϯόʔδϣϯܦ࿏ͷϩάʹ࢒ͨ͠Γͱ͔

    View Slide

  23. ༨ஊ໋໊ʹ໎͏৔߹
    w ಈࢺͷ໊ࢺܗΛ࢖͏͜ͱ͕ଟ͍ɻSFHJTUSBUJPOBUUFOEBODF
    w Ͳ͏ͯ͠΋ͬ͘͠Γ͜ͳ͚Ε͹ݱࡏ෼ࢺΛ͔ͭ͏͜ͱ΋͋ΔSFHJTUFSJOH
    w ໊લ΋ॏཁɺͳͷ͚ͩͲલఏͱͯ͠ɺ͜ͷ֓೦Λݟग़͢͜ͱ͕΋ͬͱॏཁ
    w ͳͷͰɺ໊લ͕ࢥ͍͔ͭͳ͍৔߹Ͱ΋ఘΊͳ͍Ͱ
    w ༨ஊͷ༨ஊͰɺBQQMZͨ͜͠ͱɺΛදݱ͢Δͱ͖ࠔΓ·͢ΑͶɻ"QQMJDBUJPOͯɻ

    View Slide

  24. ΠϕϯτΤϯςΟςΟ͔ΒυϝΠϯΛݟฦ͢
    w ྫࣔͨ͠ʮΠϕϯτެ։ɾࢀՃొ࿥αʔϏεʯͱ͍͏υϝΠϯʹ͓͍ͯ
    w ʮొ࿥ʯΠϕϯτ͕ͱͯ΋େࣄͰ͋Δ͜ͱ͕վΊͯཧղͰ͖Δ
    w "3ͷ༏ΕͨػೳIBT@NBOZUISPVHIΛ׆༻͢ΔઃܭʹΑͬͯɺ

    υϝΠϯ্ͷେࣄͳग़དྷࣄΛίʔυͰදݱͰ͖͍ͯΔɻ

    View Slide

  25. 4JNQMJDJUZPO3BJMT
    ɹ3%#
    ɹ3&45

    ɹ3VCZ
    w υϝΠϯʹݱΕΔΠϕϯτΤϯςΟςΟΛ
    ݟग़͢
    w ͦΕΛAIBT@NBOZUISPVHIAؔ࿈ͷ

    ΤϯςΟςΟʹ͢Δ

    View Slide

  26. %#Ͱදݱͨ͠ίτΛ

    Ϣʔβʔ͕ѻ͑ΔΑ͏ʹ͢Δ

    View Slide

  27. 4JNQMJDJUZPO3BJMT
    ɹ3%#
    ɹ3&45

    ɹ3VCZ
    w ίτΛ3&45Ϧιʔεͱͯ͠ఆٛ͠ɺ

    αʔϏεͷػೳΛͦͷ$36%Ͱදݱ͢Δ
    w ίτͷૢ࡞ͷͨΊͷঢ়ଶભҠ΋ɺ63-΁ͷ
    ΞΫηεͰදݱ͢Δ

    View Slide

  28. 3BJMTͷؾ࣋ͪʹͳͬͯߟ͑Δ
    w ϧʔςΟϯάΛఆٛ͢Δखஈͱͯ͠͸ɺ΍͸ΓDPO
    fi
    HSPVUFTSCͰ
    ASFTPVSDFTA΍ASFTPVSDFAએݴΛ࢖͏ͷ͕͍͍ΜͰ͠ΐ͏Ͷ
    w ੲ͔ΒҰ؏ͯ͠·͢͠Ͷʜ
    w ͱ͸͍͑ʮϦιʔεͳΔ΋ͷΛ)551ܦ༝Ͱ$36%͢Δʯͱ͍͏

    ϚΠϯυηοτ͕Ή͔͍ͣ͠
    w ͳΜ͔ ༨ܭͳ΋ͷΛؚΊ
    ͨ͘͞ΜϧʔςΟϯάఆٛ͢ΔϚΫϩΈ͍ͨͳѻ͍ʹͳͬͯΔ

    View Slide

  29. 3&45ͱ3%#ɺϦιʔεͱςʔϒϧ
    w 3&45Ͱ$36%͢ΔϦιʔεͱςʔϒϧ͸ࣅΔ͜ͱ΋͋Δͷ͸ؒҧ͍ͳ͍
    w TDBGGPMEͰੜ੒͢ΔྫͰҰக͍ͤͯ͞Δͷ͸ͦΕ͸ͦ͏
    w ͔͠͠%#Λͦͷ··$36%͢Δख๏ɺͰ͸ͳ͍
    w Ϧιʔεͱςʔϒϧͷҧ͍͕ൃੜ͢Δͷ΋ͦΕ͸ͦ͏ɻ
    w ҧ͏͜ͱࣗମͰ೰·ͳ͍Ͱ

    View Slide

  30. ίτΛϦιʔεͱͯ͠ѻ͏
    resources :conferences do


    resource :registration, only: [:new, :create]


    end


    resources :registrations
    w ͜ͷྫͰ͸ɺΧϯϑΝϨϯεʹࢀՃొ࿥Ͱ͖Δͷ͸ճ͚ͩొ࿥ܥͷ
    SFHJTUSBUJPO͸୯਺SFTPVSDF
    ొ࿥ͷ63-ΛΦγϟϨʹωετ͢ΔͷΛ

    ΍ΊΔͱ΋ͬͱγϯϓϧʹͰ͖Δ

    View Slide

  31. ίτΛϦιʔεͱͯ͠ѻ͏
    w લड़ͷྫʮࢀՃొ࿥͢Δ͜ͱSFHJTUSBUJPOʯΛϦιʔεͱͯ͠දݱ͢Δɻ
    w ࢀՃొ࿥͢ΔSFHJTUSBUJPOTDSFBUF
    w ྫA1045DPOGFSFODFTLBJHJPOSBJMTSFHJTUSBUJPO
    w ొ࿥಺༰ͷ֬ೝSFHJTUSBUJPOTTIPX
    w ྫA(&5SFHJTUSBUJPOTJEA
    w ొ࿥಺༰ͷߋ৽SFHJTUSBUJPOTVQEBUF

    View Slide

  32. ൺֱ༻3&45͡Όͳ͍৔߹ʹΑ͘ݟΔ΍ͭ
    resources :conferences do


    # POST /conferences/:conference_id/register


    # => conferences#register


    post :register


    end
    w A$POGFSFODFT$POUSPMMFSSFHJTUFSAΞΫγϣϯΛఆٛͯ͠͠·͏
    w ਺͕૿͑ΔͱϧʔςΟϯά΋ෳࡶͳΔ͠ɺ$POGFSFODFT$POUSPMMFS΋ංେԽ͢Δ

    View Slide

  33. ίτΛOFX͢Δ
    w OFX΍FEJU΁ͷϧʔςΟϯά΋ఆٛ͞ΕΔ͕ɺෆཁͳΒ࢖Θͳͯ͘΋ྑ͍
    w ΧϯϑΝϨϯεৄࡉϖʔδ ADPOGFSFODFTTIPXA
    ͔ΒϘλϯΛԡ͚ͩ͢Ͱొ࿥׬ྃ͢Δ৔߹ɺ
    ௚઀ASFHJTUSBUJPOTDSFBUFAʹαϒϛοτͯ͠΋Α͍
    w ϑΥʔϜΛ+4ͰؤுΔ৔߹΋ಉ༷ʹɺ+4ʹ1045͢΂͖63-Λ౉ͯ͠1045ͤ͞Ε͹Α͍
    w ͷͪͷͪొ࿥ը໘͕΄͘͠ͳͬͨΒɺASFHJTUSBUJPOTOFXAΛ࢖͏
    w ֬ೝը໘ʮొ࿥ͯ͠ΑΖ͍͠Ͱ͔͢ ʯΈ͍ͨͳͷΛग़͍ͨ͠৔߹ͱ͔
    w ࢀՃܗଶ΍උߟͳͲ௥Ճ৘ใͷೖྗ͍ͤͨ͞৔߹ͱ͔

    View Slide

  34. ΞϓϦέʔγϣϯঢ়ଶͷભҠ
    w ΞϓϦέʔγϣϯঢ়ଶͷભҠΛɺίτͷϦιʔεʹ·ͭΘΔϖʔδભҠͰ

    දݱ͢Δ
    w ྫʮΧϯϑΝϨϯεৄࡉදࣔʯঢ়ଶͰ͸ɺొ࿥ϘλϯΛදࣔ͢Δɻ

    ϘλϯΛԡ͢ͱʮొ࿥࣌৘ใͷೖྗ଴ͪʯঢ়ଶʹભҠ͢Δ
    w ͜ΕΛABAͳϦϯΫΛఏࣔ͢Δ͜ͱɺ

    ͦΕ୧ͬͯ΋Β͏͜ͱͰදݱ͢Δ
    w ASFTPVDFTAએݴ͸͜ͷঢ়ଶભҠͷϧʔςΟϯά΋ఆٛͯ͘͠Ε͍ͯΔ

    View Slide

  35. ͞ΒʹʮίτʯΛϦιʔεͱͯ͠ΈΔ
    w ࢧ෷͍ͯ͠΄͍͠ࢧ෷͍ͱ͍͏ίτΛ࡞ͬͯཉ͍͠
    w A(&5SFHJTUSBUJPOTSFHJTUSBUJPO@JEQBZNFOUOFXAͰࢧ෷͍Ҋ಺Λදࣔ͠
    w ͔Βͷɺܾࡁ͍ͨ͡͸ಋઢ͸֎෦αʔϏε࿈ܞ͠
    w ໭ͬͯ͘ΔA(&5SFHJTUSBUJPOTSFHJTUSBUJPO@JEQBZNFOUAͰࢧ෷͍׬ྃͷࢫΛදࣔ͢Δ
    w ༧ఆͷΩϟϯηϧ͸ɺA$BODFMMBUJPOAΛDSFBUF͢Δͱ΋ߟ͑ΒΕΔ͠ɺ
    A3FHJTUSBUJPOAΛEFTUSPZ͢Δͱ΋ߟ͑ΒΕΔ
    w ͜ͷ͋ͨΓ΋ΩϟϯηϧϙϦγʔʹΑͬͯߟ͑ΒΕΔ
    w ର৅αʔϏεʹͱͬͯԿ͕ద੾͔ɺߟ͑·͠ΐ͏
    w ࢧ෷͍ͳ͠ͳΒ3FHJTUSBUJPOΛEFTUSPZɺࢧ෷͍ࡁΈͩͬͨΒฦۚϦΫΤετΛOFX͢Δɺͱ͔

    View Slide

  36. ༨ஊ%#ʹؔ܎ͳ͍ʮίτʯͷ$36%
    w ϩάΠϯ΍ϩάΞ΢τΛʮηογϣϯͷDSFBUFEFMFUFʯͱͯ͠

    දݱ͢Δ׳शɺDPPM͡Όͳ͍Ͱ͢
    w ϩάΠϯը໘ͱ͸ͭ·ΓTFTTJPOTOFX͢Δը໘Ͱ͋Γ
    w ϩάΠϯ͢Δ͜ͱ͸TFTTJPOTDSFBUFͰɺ
    w ϩάΞ΢τ͢Δͱ͸TFTTJPOTEFTUSPZ͢Δ͜ͱͳͷͩɻ

    View Slide

  37. 4JNQMJDJUZPO3BJMT
    ɹ3%#
    ɹ3&45

    ɹ3VCZ
    w ίτΛ3&45Ϧιʔεͱͯ͠ఆٛ͠ɺ

    αʔϏεͷػೳΛͦͷ$36%Ͱදݱ͢Δ
    w ίτͷૢ࡞ͷͨΊͷঢ়ଶભҠ΋ɺ63-΁ͷ
    ΞΫηεͰදݱ͢Δ

    View Slide

  38. ίτΛ$36%͢Δͱ͖ɺ
    6*ͱΠϕϯτΤϯςΟςΟͷ
    ߏ଄͕ҧͬͨΒͲ͏͢Δ

    View Slide

  39. 4JNQMJDJUZPO3BJMT
    ɹ3%#
    ɹ3&45

    ɹ3VCZ
    w 3&45GVMͳϑΥʔϜ͔Β΍ͬͯ͘Δ΋ͷͱ
    %#ͱͷҧ͍Λٵऩ͢Δ
    w 3BJMT͕ఏڙ͢ΔΠϯλʔϑΣʔεΛ

    ࢥ͍ඳ͖ͳ͕Βܧଓతʹม͍͑ͯ͘

    View Slide

  40. 3BJMTͰ3&45GVMͳೖྗΛӬଓԽ͢Δ*'
    # POST /conferences/:conference_id/registration


    def create


    @registration = current_user.registrations.build(


    conference: Conference.find_by!(name: params[:conference_id])


    )


    @registration.save!


    end

    View Slide

  41. 3BJMTͷؾ࣋ͪʹͳͬͯߟ͑Δ
    w "3#BTFͷΦϒδΣΫτΛੜ੒͢Δͱ͖ͷΠϯλʔϑΣʔε͕͜Ε
    w ͷͪʹಉ༷ͷ*'Λ࡞ΔͨΊͷ"DUJWF.PEFM ҎԼ".P
    ΋ग़͍ͯΔ
    w ͞Βʹద੾ʹೖྗΛߜΔͨΊͷػߏͱͯ͠4USPOH1BSBNFUFST΋͋Δ
    w ͍ΖΜͳํ͕ࣜ͋Δ͏ͪɺNBTTBTTJHONFOUͱ૬ੑͷྑ͍΍͕ͭ࠾༻͞Εͨ
    ΤϯτϦϙΠϯτʹBUUSJCVUFTͷ)BTI ͷΑ͏ͳ΋ͷ
    Λ౉ͯ͠

    NBTTBTTJHONFOU͠ɺϑΝαʔυΛݺͿͷ͕جຊߏ଄

    View Slide

  42. ྫ͑͹ొ࿥࣌ʹऔΔ৘ใΛ૿΍͢
    def create


    @registration = current_user.registrations.build(


    conference: Conference.find_by!(name: params[:conference_id]),


    **params.require(:r10n).permit(:note, :attend_type)


    )


    @registration.save!


    end
    උߟ OPUF
    ͱࢀՃछผ BUUFOE@UZQF*/@1&340/c0/-*/&
    ͱΛ

    ೖྗՄೳʹͯ͠ΈΔ
    w ༨ஊ"$1BSBNFUFSTUP@IBTIΛͰ౉ͯ͠ύϥϝʔλΛ௥Ճ͢Δ΍ͭɺॻ͖ຯ͕ྑͯ͘޷͖Ͱ͢
    SOʹSFHJTUSBUJPOͷུͰ͢

    View Slide

  43. ͞ΒʹલޙॲཧΛ͸͞Έ͍ͨ৔߹
    w લޙॲཧ͕ඞཁͳ৔߹͕͋Δɻͨͱ͑͹
    w */@1&340/ͷ৔߹ɺࢀՃ࿮ͷ֬ೝͱҾ౰ॲཧΛ͢Δ
    w ਃࠐऀຊਓʹɺड෇ϝʔϧΛૹΔ
    w ओ࠵ऀʹɺਃ͠ࠐΈ௨஌ϝʔϧΛૹΔ
    w ͜ΕΛͲ͏࣮ݱ͢Δ͔ɻ

    View Slide

  44. ίϯτϩʔϥͰ΍ͬͯ΋͍͍͚Ͳʜ
    def create


    @registration = current_user.registrations.build(


    conference: Conference.find_by!(name: params[:conference_id]),


    **params.require(:r10n).permit(:note, :attend_type)


    )


    @registration.save!


    UserMailer.registration_accepted(@registration).deliver_later


    OrganizerMailer.registration_accepted(@registration).deliver_later


    if @registration.attend_type.in_person?


    SeatAllocationJob.perform_later(@registration)





    rescue ActiveRecord::RecordInvalid => ex


    ...


    end

    View Slide

  45. ".PΛ࢖ͬͯ*'ͷ͍ۙผϨΠϠΛಋೖ͢Δ
    w ίϯετϥΫλʹɺBUUSJCVUFTͷ)BTIΛ౉͢
    w ͦͷΦϒδΣΫτͰ͸ೖྗηοτͷଥ౰ੑΛݕূ͢Δ
    w ೖྗ͕ଥ౰Ͱͳ͍৔߹ɺαʔϏεར༻ऀʹݟͤΒΕΔΤϥʔϝοηʔδΛੜ੒͢Δ
    w ଥ౰Ͱ͋Δ৔߹ɺ΍Γ͍ͨॲཧͷϑΝαʔυͱͳΔϝιουΛ࣮ߦ͢Δ
    w ͭ·ΓϑΥʔϜΦϒδΣΫτͱ͍͏͔αʔϏεΫϥεͱ͍͏͔ͷಋೖ
    w ϑΥʔϜͱݺশ͢Δ΄͏͕޷Έ
    w ͜ͷ૚΁ͷೖྗ͸ɺϢʔβʔೖྗͷܗɺ͢ͳΘͪϑΥʔϜͱҰக͓ͤͯ͘͞ͱָͩͱࢥ͏ͨΊ
    w ࣮༻্͸੒Ռ෺ͷू໿ϧʔτͱͳΔΦϒδΣΫτ΁ͷΞΫηα΋͋Δͱศར

    View Slide

  46. def create


    @form = RegistrationForm.new(


    user: current_user:,


    conference: Conference.find_by!(name: params[:conference_id])


    **params.require(:r10n).permit(:note, :attend_type)


    )


    @form.call


    redirect_to form.registration


    rescue ...
    ".PΛ࢖ͬͯ*'ͷ͍ۙผϨΠϠΛಋೖ͢Δ
    ʮ3FHJTUSBUJPO'PSN͸ొ࿥ϑΥʔϜΛද͢ΦϒδΣΫτͰ͢ʯ

    View Slide

  47. class RegistrationForm < ApplicationForm


    attribute :user, :conference, :note, :attend_type


    validates :attend_type, inclusion: {in: ...}


    attr_reader :registration


    def call


    @registration = user.registration.create!(...)


    notify_registration!


    if @registration.attend_type.in_person?


    SeatAllocationJob.perform_later(@registration)
    ".PΛ࢖ͬͯ*'ͷ͍ۙผϨΠϠΛಋೖ͢Δ
    ".P.PEFMͱ͔".P"UUSJCVUFͱ͔Λ
    JODMVEFͨ͠ബ͍εʔύʔΫϥε

    View Slide

  48. ͓͓ΉͶ;ͭ͏ͷ3VCZ0CKFDU
    w ".PΛ࢖ͬͯΔͷͰ1MBJO0MEͱ͸ݴ͑ͳ͍͔΋͠Εͳ͍͚Ͳ
    w Ͱ΋;ͭ͏ͷ3VCZΦϒδΣΫτͱͯ͠ѻ͍΍͍͢Ͱ͢ΑͶ
    w ίϯετϥΫλʹɺBUUSJCVUFTͷ)BTIΛ౉͢
    w ΍Γ͍ͨॲཧͷϑΝαʔυͱͳΔϝιουΛ࣮ߦ͢Δ
    w ͔ͦ͜Β͞ΒʹෳࡶʹͳͬͨΒ3VCZͱͯ͠ෳࡶ͞ʹ޲͖߹͑͹ྑ͍
    w ΈΜͳେ޷͖03.Ͱ͋Δ"DUJWF3FDPSE΋࢖͑Δ

    View Slide

  49. ;ͭ͏ͷ30ͳͷͰࣗಈςετ΋ॻ͖΍͍͢
    w "SSBOHFηοτΞοϓ
    w ίϯετϥΫλʹɺBUUSJCVUFTͷ)BTIΛ౉͢
    w "DUॲཧ࣮ߦ
    w ϑΝαʔυΛݺͼग़ͯ͠ॲཧͷҰ࿈͕૸Δ
    w "TTFSU݁Ռݕূ
    w ࡞Γ͍ͨσʔλͷू໿ϧʔτʹΞΫηεͰ͖ΔͷͰɺ

    ͔ͦ͜ΒҰ࿈ͷσʔλάϥϑ͕ҙਤ௨ΓͰ͖͍ͯΔ͔ΛݕূͰ͖Δ
    w όϦσʔγϣϯΤϥʔʹͳΔೖྗύλʔϯ΋௥Ճ͠΍͍͢
    w ޙॲཧ͕࣮ߦ͞ΕΔ͔ͳͲ΋ςετͰ͖Δ

    View Slide

  50. ίτͷDSFBUFͱ%#ӬଓԽͱͷؒ
    w 3FHJTUSBUJPOT$POUSPMMFSDSFBUFΛड͚ΔΞΫγϣϯͱͯ͠ɺ

    */4&35JOUPSFHJTUSBUJPOTҎ֎ͷ͜ͱ·Ͱ΍͍͍ͬͯͷ
    w ͦͷαʔϏεͷ੹຿ͱͯ͠ʮࢀՃొ࿥͢Δ͜ͱʯ෇ਵ͢ΔॲཧͰ͋Ε͹΍͍͍ͬͯ
    w Ή͠Ζ΍Δ΂͖
    w 3FHJTUSBUJPOϦιʔεͷDSFBUF͸ɺʰαʔϏεར༻ऀͷߟ͑Δʮొ࿥͢Δ͜ͱʯʱΛද͍ͯ͠Δ
    w ҧ࿨ײ͕ग़͖ͯͨΒɺίʔυͷ༷ࢠΛΈͯநग़͍ͯ͘͠
    w 3VCZͳͷͰ
    w ΠϯλʔϑΣʔε͕҆ఆ͓ͯ͠Γςετ΋ॆ࣮ͤ͞΍͍͢ͷͰɺϦϑΝΫλϦϯά͠΍͍͢͸ͣ

    View Slide

  51. ඞͣ͠΋શ෦Λͭͷ'0ʹೖΕͳ͘ͱ΋ྑ͍
    w ॻ͍ͯΈΔͱɺϑΥʔϜΦϒδΣΫτʹ͢΂ͯΛ٧ΊΔʹ͸ҧ࿨ײ͕

    ͋Δ͜ͱ΋͋Δ
    w ΍ͬͺΓϝʔϧ͸ίϯτϩʔϥͰૹΓͨ͘ͳΔ͔΋͠Εͳ͍ɺͱ͔
    w ॻ͍ͨ౰ॳ͸ྑͯ͘΋ɺػೳ௥ՃͰมΘͬͯ͘Δ͜ͱ΋͋Δ
    w ෼͚ͨ͘ͳͬͨͱ͖΋ɺॊೈʹநग़͍ͯ͘͠
    w 3VCZͳͷͰ
    w ΠϯλʔϑΣʔε͕҆ఆ͓ͯ͠Γςετ΋ॆ࣮ͤ͞΍͍͢ͷͰɺϦϑΝΫλϦϯά͠΍͍͢͸ͣ

    View Slide

  52. 4JNQMJDJUZPO3BJMT
    ɹ3%#
    ɹ3&45

    ɹ3VCZ
    w 3&45GVMͳϑΥʔϜ͔Β΍ͬͯ͘Δ΋ͷͱ
    %#ͱͷҧ͍Λٵऩ͢Δ
    w 3BJMT͕ఏڙ͢ΔΠϯλʔϑΣʔεΛ

    ࢥ͍ඳ͖ͳ͕Βܧଓతʹม͍͑ͯ͘

    View Slide

  53. 4JNQMJDJUZPO3BJMT
    ɹ3%#
    ɹ3&45

    ɹ3VCZ

    View Slide

  54. 3BJMTͷؾ࣋ͪʹԊ͏ͱɺγϯϓϧʹ࣮૷Ͱ͖Δ
    w ΠϕϯτΤϯςΟςΟΛݟग़ͯ͠3%#ʹදݱ͠ɺIBT@NBOZUISPVHIͳ

    "3Ϟσϧͱͯ͠ɺҰڃʹѻ͏
    w ΠϕϯτΤϯςΟςΟʹ୅ද͞ΕΔʮίτʯΛ3&45Ϧιʔεͱͯ͠ଊ͑

    ΍Γ͍ͨ͜ͱΛͦͷ$36%ૢ࡞Ͱදݱ͢Δ
    w 3BJMT͕ఏڙ͢ΔΠϯλʔϑΣʔεΛࢥ͍ඳ͖ɺ"3΍".Pɺ

    3VCZͷॊೈੑΛ׆͔ͯ͠ܧଓతʹ։ൃɾϦϑΝΫλϦϯά͍ͯ͘͠

    View Slide