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

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

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

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

解決済

Railsでcontrollerのみでshopping cart作成

shirou
shirou

総合スコア15

Ruby on Rails 5

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

1回答

0リアクション

0クリップ

363閲覧

投稿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

#cart.controller.rb class CartController < ApplicationController def index @cart = session[:cart] end def create session[:cart] = [] unless session[:cart] session[:cart] << params[:item_id] flash[:success] = "カートに追加できました!" redirect_to root_path end end

erb

<!-- top.html.erb --> <tbody> <p>商品一覧</p> <% @items.each do |item| %> <tr> <td><%= item.name %> :</td> <td><%= item.price %></td><br> <td><%= image_tag item.image.to_s %></td> <%= form_tag(cart_index_path, method: :post) do %> <%# hidden_field_tagによる商品IDの引継ぎ %> <%= hidden_field_tag(:item_id, item.id) %> <%= submit_tag("この商品をカートに入れる") %> <% end %><br> </tr> <% end %> </tbody> <%= link_to 'Check Cart', cart_index_path %>

erb

<!-- index.html.erb --> <tbody> <h1>カートの中身</h1> <% @cart.each do |item| %> <tr> <td><%= item %></td> <% end %><br> </tr> </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

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Ruby on Rails 5

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