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…もとい参考にします。