当我尝试将产品添加到我正在构建的应用中的购物车时,我总是会收到此错误Couldn't find Product with 'id'=
。根据Better Errors,我的product_items_controller.rb
中的Create方法的第一行发生了这种情况,如下所示。
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 %>
更新,添加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
另一个编辑
这是保存add_product方法的cart.rb
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
更新
这是指向github repo https://github.com/DadiHall/hlinreykdal
的链接我已经通过Active Admin创建了所有产品,并且它的工作原理应该有效。 我在这里错过了什么吗? 我无法弄清楚为什么这个错误会继续发生。
答案 0 :(得分:1)
问题在于以下代码行。
@product = Product.find(params[:product_id])
params[:product_id]
为nil
,因为它不在params
哈希中。要了解params
的含义,您可以执行以下操作。
def create
render text: params
end
现在,如果您尝试创建新的product_item
,您会发现传递给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)