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

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

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

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

Q&A

解決済

1回答

839閲覧

Railsでcontrollerのみでshopping cart作成

shirou

総合スコア15

Ruby on Rails 5

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

0グッド

0クリップ

投稿2018/08/12 06:04

編集2018/08/12 06:21

前提・実現したいこと

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

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

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

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

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

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

guest

回答1

0

自己解決

先ほどのコードで表示されている結果がitem.idであるということは、dbに自動で振られるid番号を参照しているわけなので、findメソッドを使って

def index @cart = Item.find(session[:cart]) end

以下のように記述した後に、index.html.erb内のコードを

<tbody> <h1>カートの中身</h1> <% @cart.each do |item| %> <tr> <td><%= item.name %></td> <% end %><br> </tr> </tbody>

とすることで、無事に@cartにitemモデルのメソッドを継承することができました!!!!!!やった!!!

投稿2018/08/12 06:29

shirou

総合スコア15

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問