在我的rails类别中显示类别的控制器我设置如下
def show
@categories = Category.find_by(params[:name])
end
但是当我访问此控制器时,它会返回在类别中找到的所有产品记录,而不是单个类别。
以下是我的视图控制器中类别
的代码<div class="grid">
<% @categories.products.each do |product| %>
<%= link_to product_path(id: product.slug, category_name: product.category.name), class: "card" do %>
<div class="product-image">
<%= image_tag product.productpic.url if product.productpic? %>
</div>
<div class="product-text">
<h2 class="product-title"> <%= product.name %></h2>
<h3 class="product-price">£<%= product.price %></h3>
</div>
<% end %>
<% end %>
</div>
我在这里做错了什么?
答案 0 :(得分:0)
首先,出于安全考虑,您永远不应该信任params哈希来检索记录。 Rails将“确保数据安全”#34;如果你使用哈希作为你的参数。请使用以下代码:
def show
@category = Category.find_by(name: params[:name])
end
其次,通常在显示页面上,您只想检索一条记录,因此该变量应命名为单数。我在上面纠正了这一点。
第三,如果在发布示例时使用适当的缩进,会有所帮助。它使我们更容易帮助您。
第四,下面一行(我将@categories
更改为@category
)基本上是这样说的:&#34;现在我已经有了单类别,找到所有与products
表格相关联的产品,并将它们放入|product|
变量进行迭代&#34;
<% @category.products.each do |product| %>
我不确定您要对该类别做什么,但如果您保留这行代码,它将始终显示所有产品。也许你只想展示最近的3,在这种情况下你可以做这样的事情:
在您的控制器中:
def show
@category = Category.find_by(name: params[:name])
@recent_products = @category.products.order(created_at: :desc).limit(3)
end
在您看来:
<div class="grid">
<% @recent_products.each do |product| %>
<%= link_to product_path(id: product.slug, category_name: product.category.name), class: "card" do %>
<div class="product-image">
<%= image_tag product.productpic.url if product.productpic? %>
</div>
<div class="product-text">
<h2 class="product-title"> <%= product.name %></h2>
<h3 class="product-price">£<%= product.price %></h3>
</div>
<% end %>
<% end %>
</div>
答案 1 :(得分:0)
你可以这样做 在您的控制器中,您可以编写此代码
def show
@category = Category.find_by_name(params[:name])
end
并在您的视图中可以使用
<div class="grid">
<% @category.products.each do |product|%>
// place your code what you want to display
<% end %>
</div>
我希望它会对你有所帮助,如果你有任何疑虑,请告诉我。