前提・実現したいこと
railsでショッピングカートの作成の際に
商品を表す model item
カートを表す controller cart
のみを用いて簡易ショッピングカートの作成
発生している問題・エラーメッセージ
どのショッピングカート作成例をみても、カートモデル・カートに入っている商品のモデル・商品のモデルの3つ間でモデルの継承を行って商品情報などのパラメータを受け取っているわけですが
課題の制限で商品modelとカートcontrollerしか使えない為、セッションを用いて商品情報を受け取った際に、カートの中身を表すページで商品の表しようが無いと思われる、方法を思いつきません。
フォームより:item_idにitem.idを渡している部分が問題箇所です。
渡すパラメータはitem.idと指定されている為、商品idのみしか受け取れない状態になります。
item.idをcart.controllerで受け取ること自体はできているので、item.idからitemを特定して,index.html.erbにてitem modelのメソッドを使えるようにするにはどうすれば良いでしょうか?
該当のソースコード
ruby
1#cart.controller.rb 2class CartController < ApplicationController 3 def index 4 @cart = 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
erb
1<!-- top.html.erb --> 2<tbody> 3 <p>商品一覧</p> 4 <% @items.each do |item| %> 5 <tr> 6 <td><%= item.name %> :</td> 7 <td><%= item.price %>円</td><br> 8 <td><%= image_tag item.image.to_s %></td> 9 <%= form_tag(cart_index_path, method: :post) do %> 10 <%# hidden_field_tagによる商品IDの引継ぎ %> 11 <%= hidden_field_tag(:item_id, item.id) %> 12 <%= submit_tag("この商品をカートに入れる") %> 13 <% end %><br> 14 </tr> 15 <% end %> 16</tbody> 17 18<%= link_to 'Check Cart', cart_index_path %>
erb
1<!-- index.html.erb --> 2<tbody> 3<h1>カートの中身</h1> 4<% @cart.each do |item| %> 5<tr> 6<td><%= item %></td> 7<% end %><br> 8</tr> 9</tbody>
試したこと
def create @item = Item.find(params[:id]) session[:cart] << @item
def index @item = Item.find(session[:cart])
いずれも
undefined method `each' for nil:NilClass “Couldn't find <object> without an ID”
上記エラーが帰って来ました。
また
<%= hidden_field_tag(:item_id, item.id) %>
hidden_field_tag指定の為、一つしか情報を送れないが故に、session[:cart]に全ての情報
(item.id,item.name,item.price)を送ることも叶いません。
ショッピングカート作成例及び様々なだいたい記述方法を二日かけて検索をかけても、一つのmodelとコントローラーのみで作成している例が見当たらなかったので、よほど簡易な実装課題だと思うのですが、railsはdotinstall/paiza学習を終えた程度の無学に等しいのでご教授お願いいたします。。
補足情報(FW/ツールのバージョンなど)
Rails 5.2.0
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。