Rails 检索显示控制器中的所有记录

Rails retrieving all records in show controller

在我的 rails 类别显示控制器中,我的设置是这样的

def show
    @categories = Category.find_by(params[:name])
  end

但是当我访问这个控制器时,它 returns 在类别而不是单个类别中找到的所有产品记录。

这是我的视图控制器中类别

的代码
<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>

我做错了什么?

首先,出于安全考虑,您永远不应信任参数哈希来检索记录。如果您使用散列作为参数,Rails 将 "make the data safe"。使用下面的代码:

def show
  @category = Category.find_by(name: params[:name])
end

其次,通常在展示页面上,您只想检索一条记录,因此变量应命名为单数。我在上面更正了。

第三,如果您在发布示例时使用适当的缩进,它会有所帮助。它使我们更容易为您提供帮助。

第四,下面这行(我把@categories改成了@category)基本上是说:"Now that I have this single category, find all the products associated with it in the products table and put them into the |product| variable for iteration"

<% @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>

你可以这样做 在您的控制器中,您可以编写此代码

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>

希望对您有所帮助,如果您有任何疑虑,请告诉我。