7

ユーザーが定義済みのフィルター リンクを選択した場合、インデックスはその要求に基づいてどのように結果を表示しますか?

<h1>Products</h1>
<% @products.each do |product| %>
<%= link_to product.name, product_path(product) %>
<% end %>

<h2>Find Product by Category</h2>
Electronics
Apparel
Books

たとえば、「エレクトロニクス」カテゴリの製品のみを含むように製品インデックスをフィルタリングするには、「エレクトロニクス」リンクを作成するにはどうすればよいですか? 「カテゴリ」フィールド/列は、データベース/モデルで既に定義されています。

これは現在、私のコントローラーがどのように見えるかです:

def index
  @products = Product.all
end

ありがとう。

4

2 に答える 2

15

リンクを製品に戻るリンクにしますが、URL パラメータとしてカテゴリを追加します。

次に、コントローラーで、パラメーターが存在する場合は、それに基づいて結果をフィルター処理します。そのような:

意見:

<h2> Find Product by Category </h2>
  <%= link_to "Electronics", products_path(:category=>"electronics")

コントローラ

def index
  if params[:category]
    @products = Product.where(:category => params[:category])
  else
    @products = Product.all
  end
end

egyamado のコメントに基づく:

フラッシュ メッセージを追加する場合は、次のようになります。

def index
  if params[:category]
    @products = Product.where(:category => params[:category])
    flash[:notice] = "There are <b>#{@products.count}</b> in this category".html_safe
  else
    @products = Product.all
  end
end

商品がない場合にのみメッセージを表示したい場合if @products.empty?は、フラッシュ指定の末尾に追加するだけです

または、製品がない場合はエラー メッセージを表示し、製品がある場合は通知を表示する場合は、完全に条件付きにすることもできます。

def index
  if params[:category]
    @products = Product.where(:category => params[:category])
    if @products.empty?
      flash[:error] = "There are <b>#{@products.count}</b> in this category".html_safe
    else
      flash[:notice] = "There are <b>${@products.count}</b> in this category".html_safe
    end
  else
    @products = Product.all
  end
end
于 2013-11-04T02:38:16.637 に答える