2016-08-28 3 views
1

Когда я пытаюсь добавить продукты в корзину в приложении, которое я создаю, я всегда получаю эту ошибку Couldn't find Product with 'id'=. Согласно Better Errors это происходит в первой строке метода Create в моем product_items_controller.rb, как показано ниже.Не удалось найти продукт с «id» = при добавлении продуктов в корзину в приложении Rails

def create 
    @product = Product.find(params[:product_id]) 
    @product_item = @cart.add_product(product.id) 
    if @product_item.save 
     redirect_to root_url, notice:'Product added to Cart' 
    else 
     render :new 
    end 
end 

Я изменил первую строку: @product = Product.find(params[:id]), но это не исправить ошибку.

Ранее сегодня я изменил код Add to Cart кнопки от: <%= button_to product_items_path(product_id: product) do %> до <%= button_to product_items_path(@product) do %>

Это код Добавить в корзину кнопки, как сейчас.

<%= button_to product_items_path(@product) do %> 
    <i class="fa fa-shopping-cart"></i>Add to Cart 
<% end %> 

UPDATE, ADDED routes.rb

вот routes.rb

Rails.application.routes.draw do 

resources :categories 
resources :labels 
resources :products 

resources :carts 
resources :product_items 
resources :orders 

devise_for :admin_users, ActiveAdmin::Devise.config 
ActiveAdmin.routes(self) 
root 'pages#index' 

end 

ДРУГОЙ EDIT

вот cart.rb, который держит метод add_product

class Cart < ActiveRecord::Base 

has_many :product_items, dependent: :destroy 

def add_product(product_id) 
    current_item = product_items.find_by(product_id: product_id) 
    if current_item 
     current_item.quantity += 1 
    else 
     current_item = product_items.build(product_id: product_id) 
    end 
    current_item 
end 

def total_price_usd 
    product_items.to_a.sum{|item| item.total_price_usd} 
end 

def total_price_isl 
    product_items.to_a.sum{|item| item.total_price_isl} 
end 
end 

UPDATE

здесь ссылка на GitHub репо https://github.com/DadiHall/hlinreykdal

Я создал весь продукт с помощью активного администратора, и это работает, как он должен работать. Я что-то упустил? Я не могу понять, почему эта ошибка продолжается.

+0

К какому действию относится маршрут 'product_items_path (@product)' map? Можете ли вы разместить свои маршруты.rb? А что такое '@ cart' и' product' внутри 'create'? –

+0

Привет, я добавил route.rb и cart.rb .... метод add_product находится в cart.rb – DaudiHell

+0

Что такое 'product' во второй строке' create' action? –

ответ

1

Проблема заключается в следующей строке кода.

@product = Product.find(params[:product_id]) 

params[:product_id] является nil причиной его нет в params хэш. Чтобы знать, что делает params, вы можете сделать что-то вроде этого.

def create 
    render text: params 
end 

Теперь, если вы пытаетесь создать новый product_item, вы найдете Params передаваемые create действия.

Однако, если вы хотите, чтобы product_id был передан в действие create, вам нужны nested маршрутов.

resources :products do 
    resources :product_items 
end 

И изменить HTML, как

<%= button_to product_product_items_path(@product) do %> 
    <i class="fa fa-shopping-cart"></i>Add to Cart 
<% end %> 

Вы можете найти маршруты, проложенные запустив rake routes.

Во второй строке creation действия,

@product_item = @cart.add_product(product.id) 

Я не уверен, что product есть. Должно ли оно быть

@product_item = @cart.add_product(@product.id) 

?

+0

Извините Mr.Kumar, это не работает – DaudiHell

+0

Какая ошибка вы получаете? –

+0

Если я использую вложенные маршруты, я получаю 'undefined method 'product_items_path'' для кнопки add to cart, это код для кнопки' <% = button_to product_items_path (@product) do%> ' – DaudiHell