我的add_item
方法存在问题,无法理解原因。
这是我的carts_controller.rb
class CartsController < ApplicationController
def index
@cart_items = CartItem.all
end
def add_item
@cart_item = CartItem.new
produit_id = params[:produit_id]
@cart_item = CartItem.find_or_create_by(params[:produit][:produit_id])
@cart_item.save
binding.pry
end
end
以下是produits/index.html.erb
(问题来自哪里)
<div id="produits-column-container">
<% if @produits %>
<% @produits.in_groups_of(4, false).each do |g| %>
<% g.each do |produit| %>
<div id="produits-row-container">
<div id="fiche-produit-container">
<div id="produit-img">
<%= image_tag produit.photo %>
</div>
<div id="produit-nom">
<%= produit.nom %>
</div>
<div id="produit-prix">
<%= number_to_currency(produit.prix, unit: '€', format: "%n%u") %>
</div>
<div id="produit-au-panier">
<%= image_tag('icon/icon-panier') %>
<%= link_to 'Ajouter au panier', carts_add_item_path, method: :post %>
</div>
</div>
</div>
<% end %>
<% end %>
<% end %>
</div>
我给出的错误是:
ArgumentError in CartsController#add_item
wrong number of arguments (given 0, expected 1)
in def add_item(produit_id)
add_item(produit_id)
与carts_add_item_path
我也给你路线:
Rails.application.routes.draw do
match "/mon-panier" => 'carts#index', via: :get
post 'carts/add_item' => 'carts#add_item'
resources :categories do
resources :produits
end
resources :order_abonnements, only: [:create, :update, :delete]
get 'livraisons_type/index'
match "/recapitulatif" => 'recapitulatif#index', via: :get
match "/confirmation-carte-cadeau" => 'recapitulatif#confirmation', via: :get
match "/livraison-carte-cadeau" => 'livraison_carte#index', via: :get
match '/activation-carte' => 'code_carte_cadeau#index', via: :get
match "/offrir-une-box-bretonne" => 'cadeau#index', via: :get
resources :order_items, only: [:create, :update, :destroy]
match "/nos-box" => 'nos_box#index', via: :get
get 'categories/index'
devise_for :admin_users, ActiveAdmin::Devise.config
ActiveAdmin.routes(self)
match '/informations-penn-ar-box' => 'informations_penn_ar_box#index', via: :get
match '/livraison-box-bretonne' => 'livraison_box_bretonne#index', via: :get
match '/abonnements' => 'abonnements#index', via: :get
devise_for :users, path: '', path_names: { sign_in: 'connexion', sign_out: 'déconnexion'}
resources :users do
delete 'déconnexion' => 'devise/sessions#destroy'
end
match '/mon-marche-breton' => 'marche_breton#index', via: :get
root 'home#home'
end
日志:
Started POST "/carts/add_item" for ::1 at 2017-05-30 09:48:52 +0200
Processing by CartsController#add_item as HTML
Parameters: {"authenticity_token"=>"QrToQUHVxjuV5cUvZYHd7tj457htfZohOkmsvNDnKv79P413xjsSfR/8RVXtdIU7/wcmhcxjkU85N13CqJkG2w=="}
Cart Load (0.3ms) SELECT `carts`.* FROM `carts` WHERE `carts`.`id` = 1 LIMIT 1
Completed 500 Internal Server Error in 27ms (ActiveRecord: 14.9ms)
ArgumentError (wrong number of arguments (given 0, expected 1)):
app/controllers/carts_controller.rb:6:in `add_item'
答案 0 :(得分:1)
您需要将produit_id作为参数传递。
所以改变这一行......
<%= link_to 'Ajouter au panier',
carts_add_item_path(produit_id: produit.id), method: :post %>
并改变你的控制器方法......
def add_item
produit_id = params[:produit_id]
...
将find_or_create更改为
@cart_item = CartItem.find_or_create_by(produit_id: produit_id)
这意味着您的整个应用程序中只能有一个指向产品的CartItem ......奇怪的设计。
答案 1 :(得分:0)
此代码存在许多错误,但为了抑制错误,您可以做的最简单的事情是将方法签名更改为:
def add_item
而不是
def add_item(produit_id)
P.S。控制器不是RESTful。它被称为CartsController
,但在您的索引操作中,您列出的是CartItems
,而不是Carts
。正确的名称应为CartItemsController
。如果您将控制器重命名为CartItemsController
,则index
操作可以保持不变,但最好将add_item
操作重命名为create
。因此,在您的路线中,您可以:
resources :cart_items, only: [:index, :create]
此外,我不完全确定add_item
方法中发生了什么 - 首先您为@cart_item指定了新的CartItem
,但随后您使用{{1}覆盖此作业}。此外,在方法结束时对find_or_create_by...
的调用是多余的,因为save
将保存记录,否则create
行与{{1}之间未进行任何修改行。