Slide 1

Slide 1 text

໓ɾαʔϏεΫϥε Roppongi.rb #27 2025/02/13 1

Slide 2

Slide 2 text

ࣗݾ঺հ • ໊લ: ਖ਼ಙ ޼(aka: ਆ଎) • GitHub: @sinsoku (ը૾ӈ্) • X: @sinsoku_listy (ը૾ӈԼ) • Railsྺ: 10೥͘Β͍ 2

Slide 3

Slide 3 text

એ఻: ! sinsoku/rbs-trace • ςετͷ࣮ߦ࣌ʹܕ৘ใΛऩू • ࣗಈతʹ rbs-inline ͷίϝϯτΛૠೖ • ։ൃதʢmain ϒϥϯνͷར༻Λਪ঑ʣ 3

Slide 4

Slide 4 text

αʔϏεΫϥεʹ͍ͭͯ 4

Slide 5

Slide 5 text

αʔϏεΫϥεͱ͸ • αʔϏεͷػೳΛදݱ͢ΔΫϥε • ෳ਺ϞσϧΛѻ͏Ϋϥε • ϏδωεϩδοΫΛѻ͏Ϋϥε • υϝΠϯۦಈʢDDDʣ 5

Slide 6

Slide 6 text

2025-02-12 6

Slide 7

Slide 7 text

2024-11-05 7

Slide 8

Slide 8 text

2023-10-05 8

Slide 9

Slide 9 text

2022-03-30 9

Slide 10

Slide 10 text

αʔϏεΫϥεΛ࡞Βͳ͍ٕज़ 10

Slide 11

Slide 11 text

! FormObjectʹΑΔΞϓϩʔν Railsͷ࢓૊ΈΛཧղͯ͠ϞσϧΛ্खʹҭͯΔ1 by igaiga 1 https://speakerdeck.com/igaiga/kaigionrails2024/ 11

Slide 12

Slide 12 text

⭐ ผख๏: ActiveRecord::Callbacks Λ࢖͏ • 1ͭͷτϥϯβΫγϣϯʹͳΔ • before_validation ͔ΒτϥϯβΫγϣϯʹؚ·ΕΔ2 • ϞσϧʹϩδοΫ͕ू໿͞ΕΔ • Immutable Data Model લఏͰઃܭ͢Δ 2 SQLΛൃߦ͠ͳ͍৔߹͸τϥϯβΫγϣϯͷ։࢝͸஗Ԇ͞ΕΔ 12

Slide 13

Slide 13 text

ྫ: Ϣʔβʔ͕ୀձ͢Δʢ࿦ཧ࡟আʣ 13

Slide 14

Slide 14 text

NG: UserArchiveServiceΛ࡞Δ class UsersController # POST /users/:id/archive def archive service = UserArchiveService.new(current_user) if service.call head :ok else head :bad_request end end end 14

Slide 15

Slide 15 text

NG: UserArchiveServiceΛ࡞Δ class UserArchiveService validate :unpaid_fees_must_not_exist def initialize(user) @user = user end def call ActiveRecord:"Base.transaction do # `users.deleted_at` ʹݱࡏ೔࣌Λอଘ # ؔ࿈͢ΔσʔλΛߋ৽͢Δ end end end 15

Slide 16

Slide 16 text

OK: ArchiveϞσϧΛ࡞Δ class ArchivesController def create archive = Archive.new(user: current_user) if archive.save head :ok else head :bad_request end end end 16

Slide 17

Slide 17 text

OK: ArchiveϞσϧΛ࡞Δ class Archive < ApplicationRecord belongs_to :user validate :unpaid_fees_must_not_exist after_create :set_deleted_at, :update_related_data private def set_deleted_at user.update!(archived_at: Time.current) end def update_related_data # ؔ࿈͢ΔσʔλΛߋ৽͢Δ end end 17

Slide 18

Slide 18 text

OK: ArchiveϞσϧΛ࡞ΔʢActiveModel൛ʣ class Archive include ActiveModel:"Model extend ActiveModel:"Callbacks def initialize(user:) @user = user end def save # ϝΠϯͷॲཧ end end 18

Slide 19

Slide 19 text

! ·ͱΊʢ͕࣌ؒ଍Γͳ͔ͬͨ...ʣ • CallbacksΛ࢖͏ͷ΋ѱ͘ͳ͍ • accepts_nested_attributes_for ͷར༻΋ѱ͘ͳ͍ • ͨͩ͠ Immutable Data Model Λҙࣝ͢Δ • 1ͭͷϞσϧʹ Callbacks ͕ଟ͘ͳΓෳࡶʹͳΔͨΊ ଓ͖͸࠙਌ձͰ࿩͠·͠ΐ͏ !" 19