Home > Software design >  Undefined method 'id' for #ActiveRecord::Relation
Undefined method 'id' for #ActiveRecord::Relation

Time:07-15

I am having trouble debugging this error. NoMethodError in Products#Index undefined method 'id' for #ActiveRecord::Relation

Here is my products controller:

class ProductsController < ApplicationController
  def index
    if params[:query].present?
      @products = Product.search_by_name_and_category(params[:query])
    else
      @products = Product.all
    end
  end

  def new
    @product = Product.new
    @product.user = current_user
  end

  def show
    @product = Product.find(params[:id])
  end
end

Here is my product model:

class Product < ApplicationRecord
  belongs_to :user
  has_many :bookings
  validates :name, presence: true
  validates :category, presence: true
  has_one_attached :photo
  include PgSearch::Model
  pg_search_scope :search_by_name_and_category,
  against: [ :name, :category ],
  using: {
    tsearch: { prefix: true } # <-- now `superman batm` will return something!
  }

end

This is my product-card partial.

  <div >
    <div >
      <div >
        <%= link_to product_path(@products.id) do %>
        <img src="https://source.unsplash.com/random/?<%= product.name %>" />
          <div >
            <div>
              <h2><%= product.name %></h2>
              <p><%= product.category %></p>
            </div>
          <h2><%= product.price %></h2>
      </div>
      <% end %>
    </div>
  </div>

CodePudding user response:

@products is a list of many Products. The list doesn't have an ID. Each Product in the list does.

You instead want the ID of a each individual Product in @products.

Iterate through @products and work with a single Product.

<% @products.each do |product| %>
  <div >
    <%= link_to product_path(product.id) do %>
      <img src="https://source.unsplash.com/random/?<%= product.name %>" />
    <% end %>
    <div >
      <div>
        <h2><%= product.name %></h2>
        <p><%= product.category %></p>
      </div>
      <h2><%= product.price %></h2>
    </div>
  </div>
<% end %>
  • Related