Railsのリファクタリングで悩み中・・・
Rails のコントローラで、メインの処理は共通だけど、関わってくるモデルが少しずつ違う。
前処理はbefore_filterで済ませてあり、実際のアクション内で違うところがモデルをfindするところだけなので、処理自体をモデル化するのは意味がない(と思う)。
あとリダイレクト先が違う場合もあるから、これはコントローラで対応する必要があると思う。
最初はコントローラを分けて開発していたけど、一ヶ所修正すると全部修正する必要がでてきて面倒くさいので、やっぱりリファクタリングすることにしました。
今試してみてる方法は、
- モデルの取得
def target_model case when @user @user.books when @category @category.books else Book end end
- テンプレートの選択
def my_render(action = nil) action ||= action_name case when @user render :template => "user_books/#{action}" when @category render :template => "category_books/#{action}" else # なにもしない end end
という風にしてみたものの、やっぱりコードから悪臭がする・・・
なんというかオブジェクト指向的解決方法じゃないよね、やっぱ。
↓リファクタリングでググってたら見つけたのでメモ。
http://hamasyou.com/archives/Engineer-Soul/eoeorefactoringiessoaiaaeea.php
まぁ、テストを書かずにリファクタリングしてる時点でアウトですが。
追記:
追加で検索していたら、継承をつかった解決方法を発見。かなりCOOLです。
http://revolutiononrails.blogspot.com/2007/05/drying-up-polymorphic-controllers.html
さっそく、パクr…もとい参考にします。