Ruby on Rails:错误的参数数量(给定0,预期为1)

时间:2017-05-30 07:58:13

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

我的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'

2 个答案:

答案 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}之间未进行任何修改行。