前提・実現したいこと
Railsを勉強しており、ECサイトを自作してみようとしています。
その中で、カート機能を実装しようと思い、下記サイト様のソースコードを参考にさせていただこうと試しています。
バージョン
Ruby 2.5.2
Rails 5.2.3
参考
https://qiita.com/Coolucky/items/89ce3a0f25c9dfdb38c1
https://mrradiology.hatenablog.jp/entry/2018/02/23/085103
発生している問題・エラーメッセージ
NoMethodError in CartsController#add_item undefined method `cart_items' for 4:Integer
※4の箇所は4回ほどPOSTをしていたので4となっています。
該当のソースコード
テーブル一覧
中間テーブル
Ruby
1class CreateCartItems < ActiveRecord::Migration[5.2] 2 def change 3 create_table :cart_items do |t| 4 t.integer :stocks, default: 0 5 t.references :item, foreign_key: true 6 t.references :cart, foreign_key: true 7 8 t.timestamps 9 end 10 end 11end
Cartテーブル
Ruby
1class CreateCarts < ActiveRecord::Migration[5.2] 2 def change 3 create_table :carts do |t| 4 5 t.timestamps 6 end 7 end 8end
Itemテーブル
Ruby
1class CreateItems < ActiveRecord::Migration[5.2] 2 def change 3 create_table :items do |t| 4 t.string :name, comment: "商品名", null: false, :unique => true, limit: 50 5 t.integer :stocks, comment: "在庫数", default: 0, null: false 6 7 t.timestamps 8 end 9 end 10end
モデル
Ruby
1class CartItem < ApplicationRecord 2 belongs_to :cart 3 belongs_to :item 4end 5
Ruby
1class Cart < ApplicationRecord 2 has_many :cart_items, dependent: :destroy 3 has_many :items, through: :cart_items 4end
Ruby
1class Item < ApplicationRecord 2 has_many :cart_items, dependent: :destroy 3 has_many :carts, through: :cart_items 4end
コントローラー
Ruby
1class CartsController < ApplicationController 2 before_action :setup_cart_item!, only: [:add_item, :update_item, :delete_item] 3 4 def show 5 @cart_items = current_cart.cart_items 6 end 7 8 def add_item 9 @cart = current_cart 10 @item = Item.find(params[:item_id]) 11 @cart_items = @cart.cart_items.build 12 if @cart_item.blank? 13 @cart_item = current_cart.cart_items.build(item_id: params[:item_id], cart_id: current_cart.id) 14 end 15 @cart_items.stocks += params[:stocks].to_i 16 @cart_items.save 17 redirect_to current_cart 18 end 19 20 def update_item 21 @cart_item.update(stocks: params[:stocks].to_i) 22 redirect_to current_cart 23 end 24 25 def delete_item 26 @cart_item.destroy 27 redirect_to current_cart 28 end 29 30 private 31 32 def cart_params 33 params.require(:cart).permit(cart_items: [:id, :item_id, :cart_id]) 34 end 35 36 def setup_cart_item! 37 @cart_item = current_cart.cart_items.find_by(item_id: params[:item_id]) 38 end 39end 40
エラーログ
log
1app/controllers/carts_controller.rb:11: syntax error, unexpected ')' 2Started POST "/items/1/add_item" for ::1 at 2019-08-04 15:44:23 +0900 3Processing by CartsController#add_item as HTML 4 Parameters: {"authenticity_token"=>"R1KQPoU5+FweAtpwrsgEAfZw//PGINGrODB6Vmc9NH/izzf8uu4NHtZwSnE5ArzDq+DLWDs0In89lOqRm87Mow==", "item_id"=>"1"} 5 (0.1ms) BEGIN 6 ↳ app/controllers/application_controller.rb:12 7 Cart Create (0.4ms) INSERT INTO `carts` (`created_at`, `updated_at`) VALUES ('2019-08-04 15:44:23', '2019-08-04 15:44:23') 8 ↳ app/controllers/application_controller.rb:12 9 (1.2ms) COMMIT 10 ↳ app/controllers/application_controller.rb:12 11 Item Load (0.3ms) SELECT `items`.* FROM `items` WHERE `items`.`id` = 1 LIMIT 1 12 ↳ app/controllers/carts_controller.rb:10 13Completed 500 Internal Server Error in 68ms (ActiveRecord: 42.9ms) 14 15 16 17NoMethodError (undefined method `cart_items' for 4:Integer): 18 19app/controllers/carts_controller.rb:37:in `setup_cart_item!' 20
試したこと
参考サイトのソースコードを使用して、カート機能を実装しようと試みました。
しかし、冒頭のエラーメッセージが発生してしまっています。
色々なサイトを巡っても解決策がわからずじまいです。
そもそもリレーションの記載の仕方が誤っているのでしょうか?
どなたか解決方法を教えていただけないでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/04 14:21 編集