個人的メモ:Rails AntiPatterns (2)
Rails AntiPttrnsに関する個人的メモ。今日読んだとこまで。
CHAPTER 4 Controllers
AntiPattern: Fat Controller
- コールバックは条件付きにすることも出来る。
- モデル側に処理を寄せる場合はトランザクション処理をコントローラ側に持たせる必要はない。
- _idメソッドよりもアソシエーションプロキシを使う
- ★association proxyがよく分からなかったので調査。
Solution: Move to a Presenter
- コールバックに持っていけばいいという話でもない。バランスが重要
- 特に2つのモデルに対する更新処理等で、複数のモデル間にトランザクションを貼らなければならない場合、
コントローラでもモデルでもない第3の仕組みを用いてそちらに寄せるのがいい
よくない例
class HouseControleer < ApplicationController def create @house= House.new(params[:house]) @address = Address.new(params[:address] @house.address = @adress ActiveRecord::Base.transaction do @address.save! @house.save! end redirect_to(@address) end
記事の中ではMVPとMVCを合体させて、VC間にPを持ってくる手法が紹介されている。
- 具体的にはPとしてActive Presenterモジュールを使っている。
- 上の例だとhouseとaddressをpresentsに持たせたActivePresenter::Baseを継承したクラスを作成する。
- そのクラスをnewしてsaveするようにコントローラ上は実装すれば、余計なトランザクションがいらなくなる。
- ★今は理解しているが、この書き方だと忘れそうなので、もう少し具体例を考える。
- そのクラスをnewしてsaveするようにコントローラ上は実装すれば、余計なトランザクションがいらなくなる。
AntiPattern: Bloated Sessionsの前まで読了