1日1%成長するブログ

毎日成長するために仕事/プライベートで得た学びをアウトプットするブログです

RailsでFatControllerをリファクタリングしていく方針 (随時アップデート)

Viewで使うデータをどこで整形する?

  • DBから取得したデータを整形してハッシュの配列を用意するみたいな処理は置く場所に困る
  • Modelはvalidationやscope以外は対象テーブルの操作の処理以外は極力書くべきではないので適さない
  • Viewはslimを良く使うのでrubyシンタックスを使ってそこでだけ使うデータを整形したりもできるけど、どこで何を書いてるか後で追いづらい
  • コントローラーのprivateメソッドにするのは、分かりやすいけど、そうするとあっという間にFatControllerになっていく。。
  • そこでViewModel層を使うのが良さそう。Viewで使うデータを用意するのは全てViewModelに持っていく。
  • ViewModelの責務
    • ビューに渡すインスタンス変数を用意するクラス
    • before_actionでインスタンス変数をセットしていたようなコントローラーの処理を移行できる
    • ビューに渡すハッシュや配列といったデータはEntityで表現できると尚良さそう。
  • Entityの責務
    • Modelのデータを引数で渡すとビューで扱いたいデータの形式に変換するためのクラス
    • 一度共通で使えるEntityを作ってしまえば、至るところで同じような整形処理を書く手間がなくなる

複雑な検索クエリはどこで書く?

  • joinsしてwhereして..みたいな処理をコントローラーに書くと一気に行数が増えてしまう
  • 検索処理はscopeにしてModelに持たせる。
  • findする処理もコントローラーに書くのではなく対象のモデルに持たせるといい。

管理画面で必要とされるような複雑な検索機能はどこに書く?

  • 引数を受け取って存在する場合はwhereする (where if params[:hoge].present?)
  • のようなことを書いていると一気に膨れ上がる
  • DBに紐付かない検索用のモデルクラスを作ってそこに移行する (models/searchers/xxx_searcher.rb)