前提・実現したいこと
Ruby on Rails の勉強中で、ログインなしのカート機能を実装しています。
アイテム詳細画面から同じ商品を追加した時、個数を追加したいのですがうまく実装させることが出来ずにおります。
こちらのサイトを参考にしました。
https://www.ruby-b.com/e-Learning/031104.html
##各設定内容
####テーブル
・cart(sessionを保存するところ)
・cart_item(中間テーブルの位置づけ)
・item(商品情報)
class CreateCartItems < ActiveRecord::Migration[5.2] def change create_table :cart_items do |t| t.integer :item_id, null: false t.integer :amount, null: false t.integer :cart_items, null: false t.timestamps end end end
class CreateItems < ActiveRecord::Migration[5.2] def change create_table :items do |t| t.string :name, null: false t.string :image_id, null: false t.text :introduction, null: false t.integer :price, null: false t.boolean :is_active, null: false, default: true t.timestamps end end end
####アソシエーション(関連付け)
#cart.rb has_many :cart_items, dependent: :destroy
#cart_item.rb belongs_to :item belings_to :cart
###セッション情報をApplicationControllerに記述
privete def current_cart #セッションから取得したcart_idを基にcartテーブルからユーザー情報を取得 @current_cart = Cart.find_by(id: session[:cart_id]) #存在しない場合cartを作成 @current_cart = Cart.create unless @current_cart #取得したuser情報よりIDを取得してセッションに設定 session[:cart_id] = @current_cart.id #cart情報を返却 @current_cart end
###cartモデルにadd_itemメソッドを実装
def add_item(item_id) cart_items.find_or_initialize_by(item_id: item_id) end
###コントローラのcreate
def create cart = current_cart item = Item.find(params[:item_id]) cart_item = cart.add_item(item.id) cart_item.amount = params[:amount].to_i if cart_item.save redirect_to cart_items_path, notice: '追加しました' else redirect_to item_path(item) end end private def cart_item_params params.require(:cart_item).permit(:item_id, :amount, :cart_id) end
##ビュー
<%= form_with model: @cart_item, url:"/cart_items", loacl:true do |f| %> <!--非表示--> <%= f.hidden_field :item_id, value: @item.id %> <!--個数--> <%= f.select :amount, *[1..10],include_blank: " 個数選択 ", class: 'form-select m-3' %> <!--カートボタン--> <%= f.submit 'カートに入れる', class: 'btn btn-primary m-3' %> <% end %>
エラーについて
上記の内容で実装したところ、コントローラの以下の部分でエラーになってしまいました。
cart_item.amount += params[:amount].to_i
エラーは以下です。
NoMethodError (undefined method `+' for nil:NilClass):
以下に変更した場合は新規追加はできるのですが個数の追加が出来ません。
また同じアイテムを登録すると上書きされます。
cart_item.amount = params[:amount].to_i
記述を以下に変えてみたりなどしていますが、うまくいきません。
current_cart.cart_items.find_by(item_id: params[:cart_item][:item_id]).present?
正直なところ「cartモデルにadd_itemメソッドを実装」の箇所が参考サイトの説明ではいまいち理解できずにおり、
この辺りを理解せずに実装してしまっているため解決方法がピンときておりません。
この内容についてご指摘、ご教示いただけますと幸いです。
補足情報
Rails 5.2.6
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/27 10:25
2021/12/27 12:20