自分の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'
パラメータとして 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 つしか持てないことを意味します...奇妙なデザイン。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加