簡體   English   中英

Ruby on Rails:錯誤的參數數量(給定0,應為1)

[英]Ruby on Rails: wrong number of arguments (given 0, expected 1)

我的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 (問題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'

您需要傳遞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。奇怪的設計。

此代碼有很多錯誤,但是為了抑制該錯誤,您可以做的最簡單的事情就是將方法簽名更改為:

def add_item

代替

def add_item(produit_id)

PS控制器不是RESTful的 它稱為CartsController ,但是在索引操作中列出的是CartItems而不是Carts 正確的名稱應該是CartItemsController 如果將控制器重命名為CartItemsController ,則index操作可以保持不變,但最好將add_item操作重命名為create 因此,在您的路線中,您可以:

resources :cart_items, only: [:index, :create]

另外,我不確定, add_item方法中發生了什么—首先,您將一個新的CartItem分配給@cart_item,但是隨后您用find_or_create_by...覆蓋了此分配。 同樣,在方法末尾調用save是多余的,因為create將保存記錄,否則在find_or_create_by行和save行之間未進行任何修改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM