Railsのプロジェクトで、「引数オブジェクト(parameter object)」というようなパターンを使ってみました。
ご注意
なお、ここでの「引数オブジェクト」は「コントローラーとビューのやり取りに使うもの」に限定しています。もちろん、他の場面にも使える手法ではあるのですが、今回はここだけ考えてみます。
前提となる問題
Railsの場合、モデルに値を登録するようなフォームであれば、Active Recordが強力なので、あまり悩むこともなく実装が可能です。一方で、検索や集計ページを何も考えずに実装していくと、細かい引数だらけになって、引数を処理するコードが「コントローラーで、ビューから来た引数のパース」「コントローラーで、引数を使った実際のデータ抽出処理」「ビューで、値の再表示処理」など、あちこちに散らばってしまって、コントローラーの見通しも悪くなるなど、あまりきれいでないコードとなってしまいます。
解決策としての引数オブジェクト
では、引数オブジェクトを作ってみましょう。このオブジェクト自体には
-
params
など入力からの変換機能 - パラメーターとして使うハッシュの生成機能
- パラメーターとして受け取った値から、関連するモデルなどを生成する機能
これらの機能をもたせることで、コントローラーの仕事はほぼ「この引数オブジェクトを生成するだけ」になります。
なお、この引数オブジェクトをActive Modelで作る、という選択肢もありますが、バリデーションが不要なら単なるオブジェクトでもいい気がします。
この観点で見直してみる
引数のハンドリングを担う「引数オブジェクト」という観点から他のRailsコードを見てみると、Active Record自身や、検索を行うRansackも、この引数オブジェクトとして働いていることが見えてきます。