在Rails应用程序中将产品添加到购物车时找不到具有'id'的产品

时间:2016-08-28 23:54:52

标签: ruby-on-rails ruby ruby-on-rails-4 shopping-cart

当我尝试将产品添加到我正在构建的应用中的购物车时,我总是会收到此错误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创建了所有产品,并且它的工作原理应该有效。 我在这里错过了什么吗? 我无法弄清楚为什么这个错误会继续发生。

1 个答案:

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