ここでは、ロジックとビューがスコープにどの程度関連付けられているかに応じて、2 つの選択肢があります。さらに説明しましょう。
最初の選択肢は、他の応答で既に説明したように、コントローラー内のスコープを決定することです。私は通常、@scope 変数を設定して、テンプレートに追加の利点をもたらします。
class Articles
before_filter :determine_scope
def index
@articles = @scope.all
# ...
end
protected
def determine_scope
@scope = if params[:category_id]
Category.find(params[:category_id]).articles
else
Article
end
end
end
@scope 変数を使用する理由は、単一のアクション以外のリクエストのスコープを知る必要がある場合があるためです。ビューにレコード数を表示するとします。カテゴリでフィルタリングしているかどうかを知る必要があります。この場合、on をチェックするたびに繰り返す代わりに、単に@scope.count
orを呼び出す必要があります。@scope.my_named_scope.count
params[:category_id]
このアプローチは、ビュー (カテゴリを含むビューとカテゴリを含まないビュー) が非常に似ている場合にうまく機能します。しかし、カテゴリでフィルタリングされたリストが、カテゴリのないリストとはまったく異なる場合はどうなるでしょうか? これは非常に頻繁に発生します。カテゴリ セクションではカテゴリに焦点を当てたウィジェットを提供し、記事セクションでは記事関連のウィジェットとフィルターをいくつか提供します。また、Article コントローラには、使用したい特別な before_filters がありますが、記事のリストがカテゴリに属している場合はそれらを使用する必要はありません。
この場合、アクションを分離することができます。
map.resources articles
map.resources categories, :collection => { :articles => :get }
articles_path # /articles and ArticlesController#index
category_articles_path(1) # /category/1/articles and CategoriesController#articles
現在、カテゴリ別にフィルタリングされたリストは によって管理され、CategoriesController
すべてのコントローラ フィルタ、レイアウト、設定を継承します。一方、フィルタリングされていないリストは によって管理されますArticlesController
。
追加のアクションを使用すると、ビューやコントローラーを大量の条件付きチェックで混乱させる必要がないため、これは通常私のお気に入りの選択です。