Slide 1

Slide 1 text

⼊⾨ FormObject 2025/09/26 Kaigi on Rails 2025 Shu Oogawara(@expajp)

Slide 2

Slide 2 text

• Shu Oogawara(@expajp ) • Engineering Manager Meetupコアスタッフ • 趣味 • 秘境駅めぐり🚉 • 深夜ラジオ📻 • 筋トレ💪 2 ⾃⼰紹介 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025

Slide 3

Slide 3 text

仕事で触っているコードに FormObjectがある⼈︖🤚 3 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025

Slide 4

Slide 4 text

どんなときに使っているか 説明できる⼈︖🤚 4 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025

Slide 5

Slide 5 text

どんなときに使っているか 説明できる⼈︖🤚 4 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 FormObjectの使いどころ、 難しいですよね

Slide 6

Slide 6 text

職場でのできごと • 不要なのにFormObjectを使っていた コードをレビューした • 使いどころの説明が難航 • 理解を得られたか⾃信がないまま、 書き直してもらう結果に 5 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025

Slide 7

Slide 7 text

実際、使いどころを理解するハードルは⾼い • 「こんなときに使う」解説記事はたくさんある • ⼀⽅で、導⼊を想定するシチュエーションが 記事ごとに全く違うように⾒える • バリデーションにifオプションがつき始めたら使う︖ • メールフォームを実装するときに使う︖ • accepts_nested_a,ributes_for の代わりに使う︖ 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 6

Slide 8

Slide 8 text

実際、使いどころを理解するハードルは⾼い • 「こんなときに使う」解説記事はたくさんある • ⼀⽅で、導⼊を想定するシチュエーションが 記事ごとに全く違うように⾒える • バリデーションにifオプションがつき始めたら使う︖ • メールフォームを実装するときに使う︖ • accepts_nested_attributes_for の代わりに使う︖ 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 6 共通点を⾒出し概念として理解する作業は、 個々⼈に任されている

Slide 9

Slide 9 text

理解が難しいのに、どの現場にもある 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 7

Slide 10

Slide 10 text

理解が難しいのに、どの現場にもある 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 7

Slide 11

Slide 11 text

• ⽬的 • FormObjectを理解して向き合うこと • ターゲット • FormObjectをなんとなく触っている初級者 • 初級者への説明が難しいと感じている中級者以上 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 8 発表の⽬的とターゲット

Slide 12

Slide 12 text

• 理解する • FormObjectの特徴 • FormObjectの使いどころ • 向き合う • どの現場にもある背景 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 9 FormObjectを理解して向き合う

Slide 13

Slide 13 text

• 理解する • FormObjectの特徴 • FormObjectの使いどころ • 向き合う • どの現場にもある背景 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 10 FormObjectを理解して向き合う

Slide 14

Slide 14 text

FormObjectの特徴 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 11

Slide 15

Slide 15 text

FormObjectの特徴 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 12

Slide 16

Slide 16 text

FormObjectの特徴 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 12 明確な定義がない⾔葉 本発表での定義を説明します

Slide 17

Slide 17 text

① データベースに紐付かないRubyオブジェクト ② モデルと同じI/Fで、主にコントローラから呼ばれる ③ 独⾃のライフサイクル処理を持てる ④ ビューの状態を保持できる 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 13 FormObjectの特徴 ※「わかってる⼈向け」のフォローはあとでします

Slide 18

Slide 18 text

2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 14 ①DBに紐付かないRubyオブジェクト class UserNewForm include ActiveModel::Model attr_accessor :email, :name validates :email, :name, presence: true before_save :email_to_lower_case def save # .. end private def email_to_lower_case # ... end end

Slide 19

Slide 19 text

2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 14 ①DBに紐付かないRubyオブジェクト class UserNewForm include ActiveModel::Model attr_accessor :email, :name validates :email, :name, presence: true before_save :email_to_lower_case def save # .. end private def email_to_lower_case # ... end end ActiveRecord::Base, ApplicationRecordを 継承してない

Slide 20

Slide 20 text

2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 15 class UserNewForm include ActiveModel::Model attr_accessor :email, :name validates :email, :name, presence: true before_save :email_to_lower_case def save # .. end private def email_to_lower_case # ... end end ②モデルと同じI/Fでコントローラから呼ばれる

Slide 21

Slide 21 text

2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 15 class UserNewForm include ActiveModel::Model attr_accessor :email, :name validates :email, :name, presence: true before_save :email_to_lower_case def save # .. end private def email_to_lower_case # ... end end Ac4veModel::Modelを includeしている ②モデルと同じI/Fでコントローラから呼ばれる

Slide 22

Slide 22 text

2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 16 ②モデルと同じI/Fでコントローラから呼ばれる class UserController < ApplicationController def create @form = UserNewForm.new(new_params) if @form.save redirect_to new_users_path, notice: 'ユーザを作成しました’ else render :new end end # ... end

Slide 23

Slide 23 text

2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 16 ②モデルと同じI/Fでコントローラから呼ばれる class UserController < ApplicationController def create @form = UserNewForm.new(new_params) if @form.save redirect_to new_users_path, notice: 'ユーザを作成しました’ else render :new end end # ... end Scaffoldで作った コントローラと 同じ⾒た⽬になる

Slide 24

Slide 24 text

※バリデーションとコールバックをまとめて、 ライフサイクル処理と呼ぶこととします (発表者がつけた独⾃の呼称) 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 17 ③独⾃のライフサイクル処理を持てる class UserNewForm include ActiveModel::Model attr_accessor :email, :name validates :email, :name, presence: true before_save :email_to_lower_case def save # .. end private def email_to_lower_case # ... end end

Slide 25

Slide 25 text

※バリデーションとコールバックをまとめて、 ライフサイクル処理と呼ぶこととします (発表者がつけた独⾃の呼称) 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 17 ③独⾃のライフサイクル処理を持てる class UserNewForm include ActiveModel::Model attr_accessor :email, :name validates :email, :name, presence: true before_save :email_to_lower_case def save # .. end private def email_to_lower_case # ... end end バリデーションと コールバックを持てる

Slide 26

Slide 26 text

2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 18 ④ビューの状態を保持できる 引⽤︓[Kaigi on Rails 2024] Rails Way, or the highway - Speaker Deck, https://speakerdeck.com/palkan/kaigi-on-rails-2024-rails-way-or-the-highway?slide=76 (2025/09/26閲覧)

Slide 27

Slide 27 text

• 発表者はFormObjectを使っている • 確かに、スコープが⼀部重なるレイヤはいくつかある • Application Model • View Model • Interactor • Service Object 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 19 わかってる⼈向け 他のレイヤじゃなくてFormObjectなの︖

Slide 28

Slide 28 text

わかってる⼈向け︓他のレイヤじゃなくてFormObjectなの︖ 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 20 • 他に良い⾔葉がないか、各レイヤの役割を整理した

Slide 29

Slide 29 text

わかってる⼈向け︓他のレイヤじゃなくてFormObjectなの︖ 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 20 (発表者の理解) モデルと 同じI/F ⼊⼒バリデー ション ビジネス ロジック処理 ビューの 状態保持 今回のFormObject ◯ ◯ ◯ ◯ Application Model ◯ ◯ ◯ × View Model × × × ◯ Interactor - ◯ × ◯ Service Object × × ◯ × • 他に良い⾔葉がないか、各レイヤの役割を整理した

Slide 30

Slide 30 text

わかってる⼈向け︓他のレイヤじゃなくてFormObjectなの︖ 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 20 (発表者の理解) モデルと 同じI/F ⼊⼒バリデー ション ビジネス ロジック処理 ビューの 状態保持 今回のFormObject ◯ ◯ ◯ ◯ Application Model ◯ ◯ ◯ × View Model × × × ◯ Interactor - ◯ × ◯ Service Object × × ◯ × • 他に良い⾔葉がないか、各レイヤの役割を整理した 今回する話に適したのはFormObjectだと判断

Slide 31

Slide 31 text

• 理解する • FormObjectの特徴 • FormObjectの使いどころ • 向き合う • どの現場にもある背景 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 21 FormObjectを理解して向き合う

Slide 32

Slide 32 text

FormObjectの使いどころ 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 22

Slide 33

Slide 33 text

2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 23 なぜFormObjectが必要になるのか FormObjectの使いどころを考えるための問い

Slide 34

Slide 34 text

2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 24 FormObjectを使わない実装との⽐較 使わない実装(=Rails Way) 使う実装

Slide 35

Slide 35 text

2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 24 FormObjectを使わない実装との⽐較 使わない実装(=Rails Way) R C T M リクエスト レスポンス 使う実装 • リソース(R) – コントローラ(C) – モデル(M) – テーブル(T)がすべて1対1 • ライフサイクル処理はC(R)UDで⼀様

Slide 36

Slide 36 text

2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 24 FormObjectを使わない実装との⽐較 使わない実装(=Rails Way) R C T M リクエスト レスポンス 使う実装 • リソース(R) – コントローラ(C) – モデル(M) – テーブル(T)がすべて1対1 • ライフサイクル処理はC(R)UDで⼀様 R C リクエスト

Slide 37

Slide 37 text

2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 24 FormObjectを使わない実装との⽐較 使わない実装(=Rails Way) R C T M リクエスト レスポンス 使う実装 • リソース(R) – コントローラ(C) – モデル(M) – テーブル(T)がすべて1対1 • ライフサイクル処理はC(R)UDで⼀様 R C リクエスト F

Slide 38

Slide 38 text

2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 24 FormObjectを使わない実装との⽐較 使わない実装(=Rails Way) R C T M リクエスト レスポンス 使う実装 • リソース(R) – コントローラ(C) – モデル(M) – テーブル(T)がすべて1対1 • ライフサイクル処理はC(R)UDで⼀様 R C リクエスト F ?

Slide 39

Slide 39 text

2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 24 FormObjectを使わない実装との⽐較 使わない実装(=Rails Way) R C T M リクエスト レスポンス 使う実装 • リソース(R) – コントローラ(C) – モデル(M) – テーブル(T)がすべて1対1 • ライフサイクル処理はC(R)UDで⼀様 R C リクエスト F ?

Slide 40

Slide 40 text

2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 24 FormObjectを使わない実装との⽐較 使わない実装(=Rails Way) R C T M リクエスト レスポンス 使う実装 • リソース(R) – コントローラ(C) – モデル(M) – テーブル(T)がすべて1対1 • ライフサイクル処理はC(R)UDで⼀様 R C リクエスト F ? F’ ?

Slide 41

Slide 41 text

2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 24 FormObjectを使わない実装との⽐較 使わない実装(=Rails Way) R C T M リクエスト レスポンス 使う実装 • リソース(R) – コントローラ(C) – モデル(M) – テーブル(T)がすべて1対1 • ライフサイクル処理はC(R)UDで⼀様 R C リクエスト F ? レスポンス F’ ?

Slide 42

Slide 42 text

2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 24 FormObjectを使わない実装との⽐較 使わない実装(=Rails Way) R C T M リクエスト レスポンス 使う実装 • リソース(R) – コントローラ(C) – モデル(M) – テーブル(T)がすべて1対1 • ライフサイクル処理はC(R)UDで⼀様 R C リクエスト F ? レスポンス F’ ? • モデルがFormObjectに置き換わっている • ライフサイクル処理はアクションごとに 変えられる

Slide 43

Slide 43 text

2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 25 Rails Wayの制約があると ユーザの⽬的が実現できないから なぜFormObjectが必要になるのか

Slide 44

Slide 44 text

Rails Wayの制約があると、ユーザの⽬的が実現できない • Rails Wayの制約 • R-C-M-Tはすべて1対1に対応 • 制約を⽀えている仮定 • ⼀度に⾏うのはちょうどひとつのモデル操作でよい • ライフサイクル処理はひとつのパターンのみでよい 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 26

Slide 45

Slide 45 text

Rails Wayの制約があると、ユーザの⽬的が実現できない • Rails Wayの制約 • R-C-M-Tはすべて1対1に対応 • 制約を⽀えている仮定 • ⼀度に⾏うのはちょうどひとつのモデル操作でよい • ライフサイクル処理はひとつのパターンのみでよい 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 27

Slide 46

Slide 46 text

Rails Wayの制約があると、ユーザの⽬的が実現できない • Rails Wayの制約 • R-C-M-Tはすべて1対1に対応 • 制約を⽀えている仮定 • ⼀度に⾏うのはちょうどひとつのモデル操作でよい • ライフサイクル処理はひとつのパターンのみでよい 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 27 ここが”ひとつ”でないときがFormObjectの使いどころ

Slide 47

Slide 47 text

• ⼀度に操作するモデルの数が”ひとつ”じゃない • ①モデルを操作しない(0個) • ②2個以上のモデルを操作する • モデルのライフサイクル処理のパターンが”ひとつ”じゃない • ③ライフサイクル処理をアクションごとに分ける 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 28 FormObjectの使いどころ

Slide 48

Slide 48 text

2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 29 FormObjectの使いどころ ⼀度に操作するモデルの数 0 1 2… ラ イ フ サ イ ク ル 処 理 の パ タ , ン 数 1 ①モデルを操作 しない Rails Way ②2個以上の モデルを操作 2… ③ライフサイクル 処理を分ける

Slide 49

Slide 49 text

各パターンの実例を⾒ていきましょう 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 30

Slide 50

Slide 50 text

2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 31 FormObjectの使いどころ ⼀度に操作するモデルの数 0 1 2… ラ イ フ サ イ ク ル 処 理 の パ タ , ン 数 1 ①モデルを操作 しない Rails Way ②2個以上の モデルを操作 2… ③ライフサイクル 処理を分ける

Slide 51

Slide 51 text

• 例)メールフォーム 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 32 パターン① モデルを操作しない class FeedbackForm include ActiveModel::Model attr_accessor :title, :body validates :email, :name, presence: true def save return false if invalid? SomeMailer.feedback(title, body).deliver_later true end end 参考︓form objectを使ってみよう - メドピア開発者ブログ, https://tech.medpeer.co.jp/entry/2017/05/09/070758 (2025/09/26閲覧)

Slide 52

Slide 52 text

2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 33 FormObjectの使いどころ ⼀度に操作するモデルの数 0 1 2… ラ イ フ サ イ ク ル 処 理 の パ タ , ン 数 1 ①モデルを操作 しない Rails Way ②2個以上の モデルを操作 2… ③ライフサイクル 処理を分ける

Slide 53

Slide 53 text

• 例)会社・社⻑・従業員を⼀画⾯で登録 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 34 パターン② 2個以上のモデルを操作する 参考︓accepts_nested_attributes_forを使わず、複数の⼦レコードを保存する - Money Forward Developers Blog, https://moneyforward-dev.jp/entry/2018/12/15/formobject/ (2025/09/26閲覧) class CompanyRegistrationForm include ActiveModel::Model attr_accessor :name, :address def save company.assign_attributes(company_params) company.employees << employees company.president = president company.save end end

Slide 54

Slide 54 text

2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 35 FormObjectの使いどころ ⼀度に操作するモデルの数 0 1 2… ラ イ フ サ イ ク ル 処 理 の パ タ , ン 数 1 ①モデルを操作 しない Rails Way ②2個以上の モデルを操作 2… ③ライフサイクル 処理を分ける

Slide 55

Slide 55 text

• 例)ユーザの作成と編集でバリデーション分け 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 36 パターン③ ライフサイクル処理をアクションごとに分ける class UserNewForm include ActiveModel::Model attr_accessor :screen_name, :name validates :screen_name, :name, presence: true # ... end class UserEditForm include ActiveModel::Model attr_accessor :name validates :name, presence: true # ... end

Slide 56

Slide 56 text

• 例)ユーザの作成と編集でバリデーション分け 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 36 パターン③ ライフサイクル処理をアクションごとに分ける class UserNewForm include ActiveModel::Model attr_accessor :screen_name, :name validates :screen_name, :name, presence: true # ... end class UserEditForm include ActiveModel::Model attr_accessor :name validates :name, presence: true # ... end

Slide 57

Slide 57 text

まとめ︓FormObjectの使いどころ • ユーザの要求が Rails Wayを⽀える仮定に 反するとき • ⼀度に⾏うのはちょうどひとつ のモデル操作でよい • ライフサイクル処理はひとつの パターンのみでよい • 仮定がどう崩れるかに よってパターン分けが可能 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 37 ⼀度に操作するモデルの数 0 1 2… ラ イ フ サ イ ク ル 処 理 の パ タ , ン 数 1 ①モデル を操作 しない Rails Way ②2個以上 のモデル を操作 2… ③ライフ サイクル 処理を 分ける

Slide 58

Slide 58 text

• 理解する • FormObjectの特徴 • FormObjectの使いどころ • 向き合う • どの現場にもある背景 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 38 FormObjectを理解して向き合う

Slide 59

Slide 59 text

FormObjectと向き合う 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 39

Slide 60

Slide 60 text

2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 40 FormObjectは難しいけど Railsで仕事をするなら 向き合わなくてはならない FormObjectと向き合う

Slide 61

Slide 61 text

Rails Wayの制約があると、ユーザの⽬的が実現できない • Rails Wayの制約 • R-C-M-Tはすべて1対1に対応 • 制約を⽀えている仮定 • ⼀度に⾏うのはちょうどひとつのモデル操作でよい • ライフサイクル処理はひとつのパターンのみでよい 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 41 再掲

Slide 62

Slide 62 text

Rails Wayの制約があると、ユーザの⽬的が実現できない • Rails Wayの制約 • R-C-M-Tはすべて1対1に対応 • 制約を⽀えている仮定 • ⼀度に⾏うのはちょうどひとつのモデル操作でよい • ライフサイクル処理はひとつのパターンのみでよい 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 41 この仮定を満たすならば FormObjectを使わずRails Wayでよい

Slide 63

Slide 63 text

2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 42 最近「Scaffoldで⽣成して終わり」 みたいな仕事ありました︖ さて、ここで質問です

Slide 64

Slide 64 text

2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 43 複雑な操作を ワンタップで実施したい 現代のWebアプリユーザが要求すること

Slide 65

Slide 65 text

• 例)ECサイトの購⼊処理 • 在庫を減らす • 注⽂を作成する • 決済を⾏う • 決済記録を作成する • 通知を送信する 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 44 複雑な操作

Slide 66

Slide 66 text

• 例)ECサイトの購⼊処理 • 在庫を減らす • 注⽂を作成する • 決済を⾏う • 決済記録を作成する • 通知を送信する 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 45 複雑な操作

Slide 67

Slide 67 text

• 例)ECサイトの購⼊処理 • 在庫を減らす • 注⽂を作成する • 決済を⾏う • 決済記録を作成する • 通知を送信する 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 45 複雑な操作 別々のモデルが必要

Slide 68

Slide 68 text

• 例)ECサイトの購⼊処理 • 在庫を減らす • 注⽂を作成する • 決済を⾏う • 決済記録を作成する • 通知を送信する 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 45 複雑な操作 現代ではワンタップが当たり前の処理もこれだけ複雑 別々のモデルが必要

Slide 69

Slide 69 text

• コーネル⼤学の調査(2023) • ワンクリック購⼊に登録した顧客は、 平均⽀出額・購⼊頻度・購⼊点数がいずれも増加 • サイトへの訪問回数・ページ閲覧回数・滞在時間も 増加していた 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 46 ワンタップで実施する

Slide 70

Slide 70 text

• コーネル⼤学の調査(2023) • ワンクリック購⼊に登録した顧客は、 平均⽀出額・購⼊頻度・購⼊点数がいずれも増加 • サイトへの訪問回数・ページ閲覧回数・滞在時間も 増加していた 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 46 ワンタップで実施する UXが売上に直接に影響する事例がある

Slide 71

Slide 71 text

複雑な操作をワンタップで実施できるようにすると、実装はどうなるか︖ • 操作が複雑になると • 必要なデータが増え、⼀度に操作するモデルが増える • ワンタップで実施できるようにすると • 同じモデルを別々の箇所から操作する可能性が上がる 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 47

Slide 72

Slide 72 text

複雑な操作をワンタップで実施できるようにすると、実装はどうなるか︖ • 操作が複雑になると • 必要なデータが増え、⼀度に操作するモデルが増える • ワンタップで実施できるようにすると • 同じモデルを別々の箇所から操作する可能性が上がる 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 47 いずれもFormObjectの使いどころ

Slide 73

Slide 73 text

複雑な操作をワンタップで実施できるようにすると、実装はどうなるか︖ • 操作が複雑になると • 必要なデータが増え、⼀度に操作するモデルが増える • ワンタップで実施できるようにすると • 同じモデルを別々の箇所から操作する可能性が上がる 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 47 いずれもFormObjectの使いどころ しかも、この傾向は 時間とともに⾼まっていく

Slide 74

Slide 74 text

だから現場には FormObjectが溢れているし 今後も減ることはない 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 48

Slide 75

Slide 75 text

2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 49 FormObjectは難しいけど Railsで仕事をするなら 向き合わなくてはならない FormObjectと向き合う 再掲

Slide 76

Slide 76 text

2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 49 FormObjectは難しいけど Railsで仕事をするなら 向き合わなくてはならない FormObjectと向き合う 今回の発表はその⼀助になればと思って作りました 再掲

Slide 77

Slide 77 text

• ユーザの要求がRails Wayの仮定に反するときが FormObjectの使いどころ • 使いどころは3つのパターンに分けられる • ①モデルを操作しない(0個) • ②2個以上のモデルを操作する • ③ライフサイクル処理をアクションごとに分ける • Railsで仕事をするなら、向き合わなくてはならない 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 50 全体のまとめ

Slide 78

Slide 78 text

Railsはよく「簡単」と紹介される 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 51

Slide 79

Slide 79 text

しかし、簡単な部分だけで ⾷っていけるほど⽢くはない 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 52

Slide 80

Slide 80 text

ただ「レールの伸ばし⽅」は 先⼈が検討して残してくれている 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 53 そしてAIもそれらを学習している

Slide 81

Slide 81 text

「なんとなく」で使わず 「巨⼈の肩に乗る」姿勢を忘れずに 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 54 ありがとうございました Asturio Cantabrio, CC BY-SA 4.0 , via Wikimedia Commons

Slide 82

Slide 82 text

参考⽂献 • すがわらまさのり, 前島真⼀, 橋⽴友宏, 五⼗嵐邦明, 後藤優⼀, 2020, “パーフェクトRuby on Rails【増補改訂版】”, 技術評論社 • “form objectを使ってみよう - メドピア開発者ブログ”, https://tech.medpeer.co.jp/entry/2017/05/09/070758 • “Railsの仕組みを理解してモデルを上⼿に育てる - モデルを⾒つける、モデルを分割する良いタイミング –”, https://speakerdeck.com/igaiga/kaigionrails2024/ • “Form Objects with ActiveModel | Mathias Meyer”, https://www.paperplanes.de/2012/12/6/form-objects-with-activemodel.html • “Simplicity on Rails -- RDB, REST and Ruby - Speaker Deck”, https://speakerdeck.com/moro/simplicity-on-rails-rdb-rest-and-ruby • “[Kaigi on Rails 2024] Rails Way, or the highway - Speaker Deck”, https://speakerdeck.com/palkan/kaigi-on-rails-2024-rails-way-or-the-highway • “Ruby on Railsの正体と向き合い⽅ / What is Ruby on Rails and how to deal with it? - Speaker Deck”, https://speakerdeck.com/yasaichi/what-is- ruby-on-rails-and-how-to-deal-with-it • “ApplicationModel のある⾵景 / Rails with ApplicationModel - Speaker Deck”, https://speakerdeck.com/hshimoyama/rails-with- applicationmodel • “レールの伸ばし⽅ - Speaker Deck”, https://speakerdeck.com/willnet/rerufalseshen-basifang • “ActiveRecordのモデルが1つだとつらい #Rails – Qiita”, https://qiita.com/hanachin_/items/ba1dd93905567d88145c • “Form-backing objects for fun and profit - Pivotal Labs”, http://pivotallabs.com/form-backing-objects-for-fun-and-profit/ (リンク切れ。アーカ イブ︓ https://web.archive.org/web/20130617231634/http://pivotallabs.com/form-backing-objects-for-fun-and-profit/ ) • “フォームオブジェクトとの向き合い⽅/Grow Form Objects up - Speaker Deck”, https://speakerdeck.com/moro/grow-form-objects-up 2025/09/26 ⼊⾨ FormObject – Kaigi on Rails 2025 55