4

:publishedというブール値を持つpostオブジェクトがあります。コントローラのインデックスの定義は次のようになります。

def index
  @posts = Post.all

  respond_to do |format|
    format.html # index.html.erb
    format.json { render json: @posts }
  end
end

そして、これはそのページへのリンクです:

<%= link_to 'All posts', posts_path %>

代わりに、post.publishedの投稿のみを表示するオプションが必要だとしましょう。本当です。

  • 公開された投稿のみが表示される場合を処理するために、コントローラーに別のメソッドを設定する必要がありますか?
  • 渡されるパラメーターを処理するようにインデックスメソッドを変更できますか?
  • link_toはどのようになりますか?
4

2 に答える 2

3

理論的には、キーワード/カテゴリで結果をフィルタリングするために、パラメータを介して同じコントローラにロジックを表示することは問題ありません。私はそれを次のように持っているでしょう:

<%= link_to 'All posts', posts_path(:published => true) %>

次に、コントローラー/インデックスアクションで:

def index
  @posts = Post.all
  @posts = @posts.where(:published => true) if params[:published].present?
  ...

コードをリファクタリングするには、モデル内のメソッドを次のようにスコープします。

scope :published, where(:published => true)

次に、コントローラーで次のことを実行できます。

@posts = @posts.published if params[:published].present?

チェーン/モデルスコープの詳細については、http://guides.rubyonrails.org/active_record_querying.html#scopesをご覧ください。

于 2012-08-27T20:05:09.577 に答える
2

本当にシンプル(スコープなし)にするには、次のようにします

def index
  @posts = if params[:published].present?
    Post.where(:published => true)
  else
    Post.all
  end
...

そして、paramsを使用してリンクを追加するには

%= link_to 'Published Posts', posts_path(:published => true) %>
于 2012-08-27T20:47:38.487 に答える