部屋の隅っこで書く技術ブログ

Web系企業勤務のエンジニアリングマネージャのブログです。技術ブログと称しつつ技術にまつわる個人的な話題が多めです。

【Kaigi on Rails 2025】「入門 FormObject」の補足

09/26金-27土に開催されたKaigi on Rails 2025にて「入門 FormObject」のタイトルで登壇しました。

スタッフの皆さん、聞いていただいた皆さん、ありがとうございました!

kaigionrails.org

発表に関して好評なご意見をいただく一方で、質問やツッコミも多数いただきました。

実際に説明不足な点が多々あり混乱を与えてしまった自覚があるため、この記事ではいただいたツッコミを中心にQ&A形式で補足をします。

この記事はあくまで補足に特化して作成しました。発表やその準備、カンファレンス当日の感想はまた別記事で書くつもりですのでご承知おきを。

あれをFormObjectと呼んで良いの?スコープ大きすぎでは?

A. はい。スライドにも入れました

発表中でも言った通りFormObjectという言葉には明確な定義がありません

そのため、発表の最初の方に類似のレイヤと比較して役割を明確にしました。その上で「自分のいた現場ではそう呼んでいたのでそう呼びます」という強めのエクスキューズを入れました。

確かに今回紹介したFormObjectが持っている責務は

であり、しかもユースケースをユーザ入力に限定していません。

"Form"という名前から想像できる責務はせいぜい「入力フォームの構築/状態保持・入力値のハンドリング・入力内容の永続化」あたりでしょう。これはその責務を超えたもので、正直なところ@joker1007さんの指摘と同じことをスライドを作りながら思っていました。

ただ責務の分離に関して細かく語り始めると、メインの目的であった「Railsの初級者が現場にあるFormObjectに理解して向き合う」ことから離れてしまいます。この点については表を見せることでお茶を濁すことにしました。

余談ですが、2日目の深夜に飲みながら「責務の分離どうするのが良いんだろうね」という話をした1ところClean Architectureそっくりの形に落ち着き、ボブおじさんの偉大さを感じました。

「モデル」って何を指してた?

A. ActiveRecordモデルを指していました

今回の発表中で、「モデル」は一貫してActiveRecord::Base を継承してRDBのテーブルと1対1に紐付いたオブジェクトを指していました。

……が、それについて発表の中で定義していませんでした。

実際、「モデル」と一口に言っても

  • 上記のようなActiveRecordモデル
  • ActiveModel::APIをincludeしている2オブジェクト
  • DDDにおけるドメインモデル
  • より一般的な名詞として「模型」「抽象化」「定式化」などを指すモデル

など様々な解釈がありえます。

ここを「Railsガイドでは一貫してこの意味で用いられているから大丈夫か」と都合よく解釈して省略してしまいました。

聞き手の混乱は今思えば当然のものです。説明不足で失礼いたしました。

FormObjectもモデルじゃないの?

A. モデルだと思っています。発表中でもモデルであることを否定してはいないですが、紛らわしい書き方をしていました

スライド中の「モデルがFormObjectに置き換わっている」という文言が特に混乱を招いていたようです。

この文言は「"モデル"はActiveRecordモデルを指している」ことを前提に置かないと解釈が難しいです(指摘されて初めて気が付きました……)。

もちろん、「FormObjectはモデルではない」というつもりはありません

「コントローラから見ると、FormObjectはActiveRecordモデルと同様にふるまう」という意味だと解釈してください。

Rails Wayってどういう意味で使っている?

A. "Scaffoldで生成したコード"の意味です

「モデル」と同じく発表中での定義が不十分ですし、言葉選びが大袈裟すぎです。大変失礼しました。

ところで、"FormObject"同様、"Rails Way" も定義のない言葉です。

一応、"The Rails Way"という書籍はある(未読)ものの、邦訳版で600ページを超えるため内容を一言で表現するのは難しいでしょう。

www.shoeisha.co.jp

また、Rails Doctorineはあくまで「信条(doctorine)」であって「やり方(Way)」ではないように思います。

rubyonrails.org

以上を踏まえると、「Rails Wayとはなにか」について語る際は自分の意見であることを明確にすべきですね。

これ、発表前に全部考えてたの?

A. 混乱を招いた部分はほぼそうです

聞き手の混乱を招いたのは「事前に考えてはいたが、スライドや発表には含めなかった内容」が大多数です3

すなわち内容の精査不足で、この点については大いに反省しています。

自分の疑問はこの記事では解決しなかったんだけど? or この記事にもツッコミどころがあるんだけど?

A. お待ちしています

質問やツッコミは僕のX(Twitter)で受け付けます。

できるだけ頑張って回答しますのでお待ちしております。即時の回答を保証するものではない点だけご了承ください。

おわりに

この記事は質問をいただき次第、追記する可能性があります。

最後になりましたが、発表を聞いてくださったみなさん、ありがとうございました。

カンファレンス自体は非常に楽しかったのでそれについてはまた記事にしますね。


  1. 参加者:@fusagiko, @prismriver, @sanfrecce_osaka
  2. ActiveModel::ModelActiveModel::APIをincludeしてるので発表中のFormObjectはこれに当たります
  3. もちろん、発表後に「廊下」や懇親会で議論して理解が深まった側面は大いにあります