Rails извлекает все записи в контроллере шоу

В моей категории 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>

Что я здесь делаю неправильно?


person Muhammed kanyi    schedule 22.07.2016    source источник
comment
Вы объяснили, что происходит, но что должно произойти?   -  person Wes Foster    schedule 22.07.2016
comment
#find_by должен возвращать только одну запись, поэтому это должна быть @category. В любом случае, что такое @categories?   -  person siopao    schedule 22.07.2016
comment
Можете ли вы показать декларацию о ваших отношениях? Я не думаю, что проблема в контроллере..   -  person rneves    schedule 22.07.2016
comment
За исключением имени переменных, здесь все в порядке..   -  person rneves    schedule 22.07.2016


Ответы (2)


Прежде всего, в целях безопасности вы никогда не должны доверять хешу params для получения записей. Rails «сделает данные безопасными», если вы используете хеш в качестве аргументов. Используйте этот код ниже:

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

Во-вторых, обычно на странице шоу вы хотите получить только одну запись, и поэтому переменная должна быть названа в единственном числе. Я исправил это выше.

В-третьих, полезно использовать правильный отступ при размещении примеров. Нам легче вам помочь.

В-четвертых, строка ниже (я изменила @categories на @category) в основном говорит: "Теперь, когда у меня есть эта одна категория, найдите все продукты, связанные с ней, в таблице products. и поместить их в переменную |product| для итерации"

<% @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>
person Greg Answer    schedule 22.07.2016

Вы можете сделать это в своем контроллере, вы можете написать этот код

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>

Я надеюсь, что это поможет вам, и все же, если у вас есть какие-либо проблемы, пожалуйста, дайте мне знать.

person Sonu Singh    schedule 22.07.2016