Rails检索show controller中的所有记录

时间:2016-07-22 16:33:07

标签: ruby-on-rails ruby ruby-on-rails-4 ruby-on-rails-5

在我的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>

我在这里做错了什么?

2 个答案:

答案 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>

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