質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

2819閲覧

rails カート機能の実装(多対多)NoMethodError

stwebyy

総合スコア14

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

1クリップ

投稿2019/08/04 07:04

前提・実現したいこと

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

試したこと

参考サイトのソースコードを使用して、カート機能を実装しようと試みました。
しかし、冒頭のエラーメッセージが発生してしまっています。
色々なサイトを巡っても解決策がわからずじまいです。

そもそもリレーションの記載の仕方が誤っているのでしょうか?
どなたか解決方法を教えていただけないでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

4という数値インスタンスにcart_itemsというメソッドは生えていないというエラーメッセージだと思います。
@cartにモデルインスタンスでなく数値が格納されていることが問題です。

投稿2019/08/04 08:34

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

stwebyy

2019/08/04 14:21 編集

ありがとうございます! 仰る通りのエラーメッセージでした。 そもそも、他のコントローラーで設定している `current_user`で数値のみが渡っていたことが問題のようでした。 そのため、以下のように修正しました。 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -6,11 +6,10 @@ class ApplicationController < ActionController::Base helper_method :current_cart def current_cart - if session[:cart_id] - @cart = Cart.find(session[:cart_id]) - else - @cart = Cart.create - session[:cart_id] = @cart.id - end + @cart = Cart.find(session[:cart_id]) + rescue ActiveRecord::RecordNotFound + cart = Cart.create + session[:cart_id] = cart.id + cart end end こちらでMethodErrorが解消しました。 質問に回答いただきありがとうございました。 大変助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問