前提・実現したいこと
前回の質問の続きになります。
商品を追加するたびに保存されるsession情報より、
sessionにて保存したデータを、カートの中身を表示するページにて全て出力させたい。
発生している問題・エラーメッセージ
デバッグにて session[:cart]の配列の中身を確認したところ、確かに商品追加を押すたびにitem.idが保存されていることが確認可能。
問題は
class CartController < ApplicationController def index @cart = Item.find(session[:cart]) end def create session[:cart] = [] unless session[:cart] session[:cart] << params[:item_id] flash[:success] = "カートに追加できました!" redirect_to root_path end end
にて Item.findが item.idに該当するItemを一回取得した段階で、以降の取得をなぜか拒絶する為
session[:cart] = [1,2,3,4,1,1,2,3,4,3,2]
sessionに保存されている内容が上記であった際に
@cartsのデバッグ結果 #<Item:0x00007fd5ad870200> #<Item:0x00007fd5ad870840> #<Item:0x00007fd5a911beb8> #<Item:0x00007fd5ad870520>
@cartの中身を確認すると一度しか取得されてない。
該当のソースコード
erb
1#index.html.erb 2<tbody> 3<h1>カートの中身</h1> 4<% sum = 0 %> 5<% @cart.each do |item| %> 6<tr> 7<td>商品番号: <%= item.id %></td> 8<td>価格: <%= item.price %>円</td><br> 9<% sum += item.price %> 10<% end %><br> 11合計金額: <%= sum %>円 12</tr> 13</tbody> 14<br> 15<%= link_to 'Check Products', root_path %>
ruby
1#cart.controller.rb 2class CartController < ApplicationController 3 def index 4 @cart = Item.find(session[:cart]) 5 end 6 7 def create 8 session[:cart] = [] unless session[:cart] 9 session[:cart] << params[:item_id] 10 flash[:success] = "カートに追加できました!" 11 redirect_to root_path 12 end 13 14end
試したこと
Item.findではなく、Item.whereで実行→whereの後に続くのは条件である為,session[:cart]は×
キーワードを変えてググったものの、状況が特殊である為かhitしなかったので断念。
そもそも商品の個数を考慮していないコードである為、当然の結果なのかもしれないが
「配列に保存された内容を表示する」ことは何ら問題のないことであると思う。
また、Item.find(session[:cart])でなければ、index.html.erbにて、item modelのメソッドを継承できない恐れがある為、現状ではどう変更すればいいかわかりません。。
補足情報(FW/ツールのバージョンなど)
Rails 5.2.0
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/12 13:20
2018/08/12 13:22
2018/08/13 05:20
2018/08/15 05:58
2019/12/06 09:04