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

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

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

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

Q&A

解決済

2回答

977閲覧

Ruby on Rails 1対多の関係のデータを取得して表示したい

nissyan

総合スコア15

Ruby on Rails 5

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

0グッド

0クリップ

投稿2020/01/20 08:30

編集2020/01/20 15:47

実現したいこと:

イメージ説明

上記のER図で、menuテーブルとcartテーブルが1対多の関係で構成されており、menu一覧画面から
カートに入れるをクリックすると、cartテーブルにデータが入るように組み立てました。

ユーザーがcartテーブルに入れたデータを、cartコントローラーのshowアクションで、cartカラムのmenu_idを使用してmenuテーブルに入っているデータを一覧としてcartのshowページで表示したいと思っています。


現状のコード

ruby

1class Menus::ApplicationController < ApplicationController 2end

ruby

1 2class Menus::CartsController < Menus::ApplicationController 3 4 def create 5 order = current_user.prepare_order 6 menu = Menu.find(params[:menu_id]) 7 @cart = order.carts.new(cart_params) 8 @cart[:menu_id] = menu.id 9 if @cart.save 10 redirect_to cart_path(current_user) 11 else 12 render :new 13 end 14 end 15 16 17 def destroy 18 end 19 20 private 21 def cart_params 22 params.require(:cart).permit(:quantity).merge(user_id: current_user.id); 23 end 24 25end

ruby

1class CartsController < ApplicationController 2 def new 3 @cart = Cart.new 4 end 5 6 def show 7 @cart = Cart.where(user_id: current_user.id) 8 @menu = Cart.all.includes(:menu) 9 end 10 end

ruby

1class Cart < ApplicationRecord 2 belongs_to :order 3 has_many :menus 4end

ruby

1class Menu < ApplicationRecord 2 belongs_to :cart, dependent: :destroy 3 belongs_to :category 4end

エラー内容

Ruby

1Cartコントローラーshowアクションのページ 2 3<%= render 'layouts/header' %> 4 5<div class="cart-container"> 6 <div class="cart-history"> 7 <h3>注文履歴</h3> 8 </div> 9 10 <div class="cart-selection"> 11 <section> 12 <ul> 13 <li><a href="#">カート</a></li> 14 <li><a href="#">注文済み</a></li> 15 <li><a href="#">キャンセルされた注文</a></li> 16 </ul> 17 </section> 18 </div> 19 20<% @cart.each do |cart|%> 21 <form action="#" method="post"> 22 <div class="cart-content"> 23 <div class="cart-details-top"> 24 <ul> 25 <li>注文日:<br><span></span></li> 26 <li>配達予測時間:<br><span></span></li> 27 <li>お届け先:<br><span></span></li> 28 <li>金額<br><span>¥</span></li> 29 </ul> 30 </div> 31 32 <div class="cart-details-under"> 33 <div class="in-cart-name"> 34 <p>商品名:<span><%= @menu.name %></span></p> 35 <p>個数:<span><%= cart.quantity %>個</span></p> 36 <img src="" alt="image" width="180px" height="150px"> 37 </div> 38 <div class="cart-important"> 39 <p>アレルギー物質表示:</p> 40 <p>商品説明</p> 41 <p>食材</p> 42 </div> 43 </div> 44 </div> 45</div> 46<% end %> 47 48<div class="price-container"> 49 <h3>合計金額: ¥</h3> 50 <button type="submit" name="buy">注文する</button> 51 </form> 52</div> 53 54<div class="image-box"> 55 <div class="main-image"> 56 <%= link_to do %><%= image_tag asset_path("main-menu.png"), alt:"main-menu", width:"30px" %><% end %> 57 </div> 58 59 <div class="single-box"> 60 <%= link_to do %><%= image_tag asset_path("single-menu.png"), alt:"main-menu", width:"30px" %><% end %> 61 </div> 62 63 <div class="drink-box"> 64 <%= link_to do %><%= image_tag asset_path("drink-menu.png"), alt:"main-menu", width:"30px" %><% end %> 65 </div> 66 67 <div class="reservation-box"> 68 <%= link_to do %><%= image_tag asset_path("reservation-menu.png"), alt:"main-menu", width:"40px", height:"20px" %><% end %> 69 </div> 70</div> 71 72<%= render 'layouts/footer' %>

商品名を出力すると、名前が出力されずに、"Cart"という文字が出力されます。

予備情報

イメージ説明
Cartテーブルには、データが入っています。

イメージ説明
Menuテーブルを同様です。


分かる方知識を貸してください。
すみませんが、宜しくお願いいたします。

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

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

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

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

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

winterboum

2020/01/20 11:01

載せるプログラムを適当に削除するのはなしに。 controllerのcreate確認したいし、viewも途中で切れている。 このviewがshowならエラーになると思うのだがなっていない。 のが不思議
nissyan

2020/01/20 15:54

@winterboumさん いつもありがとうございます。 引き続きショッピングカート機能を実装しています。 情報不足の部分追記させていただきました。 "載せるプログラムを適当に削除するのはなしに。" →以前の質問の際はすみません! お忙しいこと申し訳ありませんが、ご確認していただけたら嬉しいです。
guest

回答2

0

ベストアンサー

大きく二つ[1]システムのモデリング [2]Cartという文字が出る
[1]
nissyanさんのイメージしている世界がどうもうまく頭に入ってきません。
0. menuとCategoyはマスターとしてある。全てのuserや注文に共通で使われる。
は合っているとおもうのですが
0. Menuがbelongs_to :cartというのが?? これは1)とは矛盾。
CartMenuという中間tableが必要なのでは?そこに個数などが入る
0. Cart が  belongs_to :order と言うことは注文ごとにCartが作成される?
ですとCartとOrderを分ける必要はないのでは?
前回の質問の時にCartに取り込んで発注したらOrderに、とコメントしたのは、前回はCartがいつ作られるのかはっきりしていなかったので、User毎に専用に11台割り当てておくことを考えての、コメントです。
そこ(Cartを適切なタイミングで用意する)は今回クリアできたみたいですから、==Orderで良さそうです。

3)はついで、で2)が今回のコメントの一番気になっている所です

[2]>"Cart"という文字が出力されます。 多分それ以外にも前後に出ていると想うのですがそれを見えるようにするかどうかで、回答の質が変わります。
肝心なところを省略してくださる。エラー関係は編集しない方が良いです
で、@menu.name とあたかも@menuは一つのMenuのような顔をしていますが、実体は@menu = Cart.all.includes(:menu) すなわちCartのrelationです。ですので、「Cartのrelation」のnameがでています。

ここは Cartにある複数のmenuのnameでしょうから

def show @cart = Cart.includes(:menu).where(user_id: current_user.id) end

とし、<div class="cart-details-under"> </div>のなかに
@cart.menus.each do |menu| end のloopを作ってその中に
商品名、個数、アレルギー物質表示、商品説明、食材 などを表示。
ここで今のモデリングだと 個数が困る。
Menuに個数はありえない。共通で使うtableだから
cartのquantityをつかってますがこれもありえない。注文した全商品が全部同じ数とは限らない。

ので、[1]の2になります。
@cart.cart_menus.each do |cart_menu| cart_menu.menu.name
って感じ。

投稿2020/01/21 00:17

winterboum

総合スコア23335

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

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

nissyan

2020/01/22 19:00 編集

@winterboumさん いつも本当にありがとうございます。 返事が遅くなり申し訳ありません。 [1]に対しての回答ですが、応急としてcartテーブルを中間テーブルとして menuとorderの間に作りました。 [2]提示の内容によって、回答の質が変わるとの指摘ありがとうございます。 もう少し回答する側の立場になってできるよう考えます。 そして、showコントローラーの記述とeach文の通りにすると無事表示できました。 本当にありがとうございます。 最後に質問ですが、表示できたコードは、間違ったコードやER図を消して記載しなおしたほうがいいですか? 問題を抱えた人が見れるようにしたほうがわかりやすいかと思いました。
winterboum

2020/01/22 20:51

元になったコードはそのままにし、解決したcodeを「これで解決」と載せるのが良いのでは。 全部かどこが異なるか判るようにか、は場合で
nissyan

2020/01/23 10:24

@winterboumさん そうですね! アドバイスありがとうございました。
guest

0

アドバイスにより解決しましたので、修正したコードを記載しておきます。
※変更点のみ記載しています。

まずはER図から

イメージ説明
↑CartテーブルをMenuテーブルとOrderテーブルの中間テーブルとしています。

そしてテーブルの関係性をモデルに記入しました。

Ruby

1//Menuモデル 2class Menu < ApplicationRecord 3 has_many :carts, dependent: :destroy 4 has_many :orders, through: :carts 5 belongs_to :category 6end 7 8//Cartモデル(中間テーブル) 9class Cart < ApplicationRecord 10 belongs_to :order 11 belongs_to :menu 12end 13 14//Orderモデル 15class Order < ApplicationRecord 16 has_many :carts, dependent: :destroy 17 has_many :menus, through: :carts 18end 19 20//Userモデルは追加記載 21class User < ApplicationRecord 22232425 def prepare_order #メソッドはカートコントローラに記載 26 order || create_order 27 end 28end 29

次はコントローラーです。

Ruby

1 2//Cartコントローラー 3 4class CartsController < ApplicationController 5 6 def new 7 @cart = Cart.new 8 end 9 10 def show 11 @cart = Cart.includes(:menu).where(user_id: current_user.id) 12 end 13 end

最後にviewです。

Ruby

1 <form action="#" method="post"> 2 <% @cart.each do |cart| %> 3 <div class="cart-content"> 4 <div class="cart-details-top"> 5 <ul> 6 <li>注文日:<br><span><%= cart.created_at.to_s(:published_on) %></span></li> 7 <li>配達予測時間:<br><span><%= cart.created_at.to_s(:datetime_jp) %></span></li> 8 <li>お届け先:<br><span></span></li> 9 <li>金額<br><span>¥<%= cart.menu.price %></span></li> 10 </ul> 11 </div> 12 13 <div class="cart-details-under"> 14 <div class="in-cart-name"> 15 <p>商品名:<span><%= cart.menu.name %></span></p> 16 <p>個数:<span><%= cart.quantity %>個</span></p> 17 <%= image_tag asset_path(cart.menu.image), alt:"image", width:"180px", height:"150px" %> 18 </div> 19 <div class="cart-important"> 20 <p>アレルギー物質表示: &nbsp;&nbsp;&nbsp;<%= cart.menu.allergy %></p> 21 <p>商品説明: &nbsp;&nbsp;&nbsp;<%= cart.menu.description %></p> 22 <p>食材: &nbsp;&nbsp;&nbsp;<%= cart.menu.ingredient %></p> 23 </div> 24 </div> 25</div> 26</div> 27 <% end %>

以上になります。

投稿2020/01/23 10:15

nissyan

総合スコア15

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問