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

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

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

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

1回答

2650閲覧

Addressモデルに追加された住所情報をOrderモデルで表示させる方法(<%= @order.address %>で表示できない場合)

tomomomac37

総合スコア0

Ruby on Rails 5

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2021/06/20 02:27

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
某スクール課題でRuby on railsを用いてケーキ屋さんのECサイト製作をしています。customer,adminで分けていて、customer側で注文をする際に注文確認画面(Orderモデル)というページがあり、そこで予めマイページから登録しておいた住所(Addressモデル)の情報を反映させたいのですが、うまく反映されません。

発生している問題・エラーメッセージ

エラーメッセージは出ないのですが、下記のように表示されてしまいます。 <h3>お届け先<%= @order.address %></h3>                                  ↓ お届け先#<Address:0x0000000009b7d208>

該当のソースコード

以下、orders_controllerになります。
addressの方では問題なく住所を新規追加できているので問題ないと思います。
addressとorderのリレーションはないです。

OrdersController

1def new 2 @order = Order.new 3 @orders = current_customer.cart_items 4 @customer = Customer.find(current_customer.id) 5 @addresses = @customer.addresses 6 end 7 8def confirm_order 9 @orders = current_customer.orders 10 @cart_items = current_customer.cart_items 11 @sum = @cart_items.sum{|ci| ci.item.price * ci.amount} 12 @order = Order.new(order_params) 13 14 if params[:selected_address] == "radio1" 15 @order.address = current_customer.address 16 @order.postal_code = current_customer.postal_code 17 @order.name = current_customer.last_name + current_customer.first_name 18 elsif params[:selected_address] == "radio2" 19 @order.address = Address.find(params[:order][:address_for_order]) 20 else 21 @order.address = Order.new 22 @order.save 23 end 24 25 26def order_params 27 params.require(:order).permit( 28 :payment_method, 29 :postal_code, 30 :address, 31 :name, 32 :customer_id, 33 :freight, 34 :billing_amount, 35 :sales_order_status 36 ) 37 end 38 39 def order_item_params 40 params.require(:order_item).permit(:order_id, :item_id, :amount, :production_status, :price) 41 end 42 43 end

注文情報入力画面(new.html.erb)

<div class="row"> <h2>注文情報入力</h2> <div class="col-xs-6" style="margin-top: 50px;"> <%= form_with model: @order, url: orders_confirm_order_path, method: :get, local: true do |f| %> <table class="table"> <tbody> <tr> <th scope="row">支払方法</th> <td> <div class="radio"> <%= f.radio_button :payment_method, "0" %> <label class="payment-label">クレジットカード</label> <%= f.radio_button :payment_method, "1" %> <label class="payment-label">銀行振込</label> </div> </td> </tr> <tr> <th scope="row">お届け先</th> <td> <div class="radio"> <%= radio_button_tag(:selected_address, :radio1) %> <%= label_tag(:selected_address, "ご自身の住所") %> <p><%= @customer.postal_code %><%= @customer.address %></p> <p><%= @customer.first_name %><%= @customer.last_name %></p> </div> <div class="radio"> <%= radio_button_tag(:selected_address, :radio2) %> <%= label_tag(:selected_address, "登録済住所から選択") %> <p> <!--ここの記述がうまくいきません--> <%= f.collection_select :address_for_order, @addresses, :id, :address %> </p> </div> <%= radio_button_tag(:selected_address, :radio3) %> <%= label_tag(:selected_address, "新しいお届け先") %> <div class="field"> <label class="postal-code-label">郵便番号(ハイフンなし)</label> <%= f.text_field :postal_code, autofocus: true, class:""%> </div> <div class="field"> <label class="address-label">住所</label> <%= f.text_field :address, autofocus: true, class:"", size:"60*60"%> </div> <div class="field"> <label class="address-label">宛名</label> <%= f.text_field :name, autofocus: true, class:"", size:"30*30" %> </div> </td> </tr> </tbody> </table> <div class="col-xs-offset-5"> <!--submit--> <%= f.submit "注文確認画面に進む", class:"btn btn-primary" %> </div> <% end %> </div> </div>

注文情報確認画面(confirm.html.erb)

<h2>注文情報確認</h2> <div class="row"> <div class="col-md-7"> <table class="table"> <thead> <tr> <th scope="col">商品名</th> <th scope="col">単価(税込)</th> <th scope="col">数量</th> <th scope="col">小計</th> </tr> </thead> <tbody> <% @cart_items.each do |cart_item| %> <tr> <th scope="row"><%= attachment_image_tag(cart_item.item, :image,size: "300x217", fallback: "no_image.jpg") %><%= cart_item.item.name %></th> <td><%= cart_item.item.price %></td> <td><%= cart_item.amount %></td> <td><%= cart_item.item.price * 1.1 * cart_item.amount.to_i %></td> </tr> <% end %> </tbody> </table> </div> <div class="col-md-5"> <table class="table"> <tbody> <tr> <td>送料</td> <td><%= 800 %></td> </tr> <tr> <td>商品合計</td> <td><%= @sum %></td> </tr> <tr> <td>請求合計</td> <td><%= @sum + 800 %></td> </tr> </tbody> </table> </div> </div> </div> <h3>支払方法<%= (@order.payment_method == 0) ? "クレジットカード" : "銀行振り込み" %></h3> <h3>お届け先<%= @order.address %></h3> <%= form_with model: @order, url: orders_path, method: :post, local: true do |f| %> <!--create確認用--> <%= f.hidden_field :customer_id %> <%= f.hidden_field :postal_code %> <%= f.hidden_field :address %> <%= f.hidden_field :name %> <%= f.hidden_field :freight %> <%= f.hidden_field :billing_amount, :value => @sum+800 %> <%= f.hidden_field :payment_method %> <%= f.submit "注文を確定する", class:"btn btn-success col-md-3" %> <% end %>

試したこと

最初はcontrollerのconfirmアクションのelsif部分で@address = @order.addressと記述していましたが

Parameters: {"utf8"=>"✓", "order"=>{"payment_method"=>"0", "address_for_order"=>"3", "postal_code"=>"", "address"=>"", "name"=>""}, "selected_address"=>"radio2", "commit"=>"注文確認画面に進む"}

となり、パラメータに値が代入されませんでした。

注文情報入力画面では、3つのラジオボタンを用いて住所を表すようになっております。
会員情報のデータをそのまま持ってくるradio0ではうまくいきますが、Addressモデルに追加されている情報(複数をプルダウンで表示)を引っ張ってくるradio1と新規フォームで住所を反映させるradio2がうまくいかず、ページ頭のような表示になります。

どなたかご教示いただけると幸いです。

補足情報(FW/ツールのバージョンなど)

ruby '2.6.3'
gem 'rails', '~> 5.2.5'

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

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

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

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

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

guest

回答1

0

addressとorderのリレーションはないです。 ならば
@order には address というmethodはないので、おかしなことになります。
関連定義しましょう
できない、したくない理由ってあるのでしょうか

投稿2021/06/20 04:08

winterboum

総合スコア23347

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

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

tomomomac37

2021/06/20 04:37

Orderにはaddressというカラムがありますが完全に別物なのでしょうか。 スクールの課題で、ER図の解答でリレーションがなかったため別の方法で解決できるのかなと考えておりました。 また、リレーションをつける場合は1つの注文に関して多くの住所があり、また1つの住所に対しても多くの注文があるともうのですが、多対多の関係になるのでしょうか。 そもそも、注文入力画面ではAddressモデルにあるものを@addressesとして追加したものを参照できるということは、確認画面でも表示させられるのでは?と思っているのですが解決方法がわからず。。。 といった感じです。
winterboum

2021/06/20 07:49

ああ、「Orderにはaddressというカラムがあります」だとすると、Orderのcreateでそこに住所を入れるですね? そのいれかたをまちがえてます。 その部分のcodeを載せてください。 関連なしに エラーでもなく、曲がりなりにも お届け先#<Address:0x0000000009b7d208> と表示してるので、はてな、とおもってました。 なお 関連は 1:1でもあります。
tomomomac37

2021/06/20 08:54

こちらcreateアクションです https://gyazo.com/72259cc3bd969d80097b58bc082cc32f ブランチを切ったGithubのURLです。 https://github.com/tomomomac37/dmm_wbc_nagano_cake/tree/develop Orderにはaddressというカラムがありますが、実際に注文確認段階なのでカラムに値が入っているのかわからない状態です。 OrderControllerでaddressのストロングパラメータを記載し、各モデルにもリレーションを記述した結果下記のような挙動、エラー文になりました。 https://gyazo.com/9b20fb1a849b4dffaffed7b0fa44c33c https://gyazo.com/4ec8c527f058f71dcbe6c529d043de4f
winterboum

2021/06/20 12:35

テキストで貼ってください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問