正直なところ、この回答の「ベストプラクティス」については保証しませんが、ある程度役立つ場合に備えて提案します。また、問題を再考した後、コメントで最初に提案された解決策が間違っていて、2番目の解決策も正しくないことに気付きました. だから私は2番目の提案の修正版のみを投稿しています:
短い答え:ほとんどPagesController
の作業を処理し、必要に応じてモデル固有のものについてのみサブコントローラーに委任します。phoet が言ったように、(別の方法で) メタ プログラミングを少し使用して、これを実現できます。
class PagesController < ApplicationController
# pages controller stuff here
def create
@page = controller_name.classify.constantize.new(params[:page_params]) # I love Rails, don't you?
@page.author = current_user
handle_additional_create_actions
# For completeness of this example...
if @page.save
# render / redirect on success
else
# render errors
end
end
protected
# This method should be overwritten by sub controllers if needed
# Also, name this whatever you like, this is merely a verbose example for illustration purposes
def handle_additional_create_actions
# in the pages controller, this method does nothing
end
end
また、モデル固有のコントローラーで実行する必要がある追加のことがある場合:
class DrawingsController < PagesController
# drawing controller stuff here
protected
def handle_additional_create_actions
@page.some_other_field = some_other_data
end
end
簡単なメモ: 私の提案では、モデル固有の変数名を削除していることに注意してください。つまり、@drawing
や@article
などはもうありません。モデルはすべて、基本的にはPage
オブジェクトの型であるため、慣例として一般的な名前で呼びます。DrawingsController
こうすることで、クラス固有の処理をに依頼すると、一般的な名前のオブジェクトDrawing
を介してインスタンスにアクセスできることがわかります。@page
したがって、最終的には、PagesController
扱っている具体的なモデルの種類に関係なく、 が面倒な作業を行います。そうすれば、一般的なページのものだけがページコントローラーで見つかり、描画、記事、またはストーリー固有のものはそれぞれの具象コントローラーで見つかります。