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

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

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

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

Q&A

解決済

2回答

6327閲覧

ECサイト作成中で注文確認画面にformを送るときプルダウンメニューのparamsが ’’ になる。

takatin

総合スコア7

Ruby on Rails 5

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

0グッド

1クリップ

投稿2020/08/05 22:47

編集2020/08/06 07:11

現在、ECサイトを作成中で、注文確認画面を作っているのですが、confirmアクションに情報を渡すときに登録済の住所から選択して、その値を送るときに理想としてはid=1の住所を選ぶとparams[:order][:order_address]に値が入り、それをto_iで数字にし、Address.findでそのAddressを得ようと思っているのですが、params[:order][:order_address]=''となり、to_iとしても0となり、id=0のAddressは探せませんというエラーが出てしまいます。```

order.controller.rb def confirm @order = Order.new @cart_items = current_end_user.cart_items @order.payment = params[:order][:payment] if params[:order][:address_option] == "0" @order.postal_code = current_end_user.postal_code @order.order_address = current_end_user.address elsif params[:order][:address_option] == "1" @sta = params[:order][:order_address].to_i binding.pry @order_address = Address.find(@sta) @order.postal_code = @order_address.postal_code @order.order_address = @order_address.address @order.dear_name = @order_address.dear_name elsif params[:order][:address_option] == "2" @order.postal_code = params[:order][:postal_code] @order.order_address = params[:order][:order_address] end end
new.html.erb <%= form_with model: @order, url: end_users_confirm_path, method: :post,local: true do |f| %> <%= f.label :payment, "支払い方法" %> <br> <%= f.radio_button :payment,:クレジットカード, checked: "checked" %> <%= f.label :payment, "クレジットカード" %> <br> <%= f.radio_button :payment, :銀行振込 %> <%= f.label :payment, "銀行振込" %> <br> <%= f.label :address, "お届け先" %> <br> <%= f.radio_button :address_option, 0, checked: "checked" %> <%= f.label :order_address, "ご自身の住所" %> <%= @end_user.postal_code %> <%= @end_user.address %> <br> <%= f.radio_button :address_option, 1 %> <%= f.label :order_address, "登録済住所から選択" %> <%= f.collection_select :order_address , current_end_user.addresses, :id, :address , :include_blank => "選択してください" %> <br> <%= f.radio_button :address_option, 2 %> <%= f.label :order_address, "新しいお届け先" %> <br> <%= f.label :postal_code, "郵便番号" %> <%= f.text_field :postal_code %> <br> <%= f.label :order_address, "住所" %> <%= f.text_field :order_address %> <br> <%= f.submit "確認画面へ進む" , class:"btn btn-primary" %> <% end %>

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

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

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

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

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

shota-imoto

2020/08/06 02:15

new.html.erbのform_for, form_withなどの記述がありましたらそちらも掲載お願いできますでしょうか?? formの記述の仕方でparamsの内容が決まってくるので、一度確認したいです。
takatin

2020/08/06 07:11

編集いたしましたので確認お願いいたします
guest

回答2

0

自己解決

新しい住所の方で
<%= f.label :order_address, "住所" %>
<%= f.text_field :order_address %>
で:order_addressが上書きされていることを発見致しました!
お手伝いしてくれて方、本当にありがとうございました!

投稿2020/08/08 21:14

takatin

総合スコア7

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

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

0

編集ありがとうございます。
formの見た目は問題なさそうですね。

気がかりなのはcollection_selectで指定しているオブジェクトcurrent_end_userですね。
その変数はどこで定義していますか?
コントローラで呼び出している場合は@current_end_userにしてインスタンス変数にしてみてはいかがでしょうか?

これで動かなければviewの先頭に

<% binding.pry %>

を追記して、current_end_userの中身を見てみましょうか。

投稿2020/08/06 12:31

shota-imoto

総合スコア37

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

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

takatin

2020/08/06 14:09

pry(#<#<Class:0x00007f94dc161840>>)> @end_user.addresses Address Load (1.3ms) SELECT "addresses".* FROM "addresses" WHERE "addresses"."end_user_id" = ? [["end_user_id", 1]] ↳ app/views/end_users/orders/new.html.erb:3 => [#<Address:0x00007f94e6197058 id: 1, end_user_id: 1, postal_code: "5551111", address: "大阪府大阪市大阪町1−1−1", dear_name: "大阪太郎", created_at: Fri, 31 Jul 2020 16:29:25 UTC +00:00, updated_at: Fri, 31 Jul 2020 16:29:25 UTC +00:00>, #<Address:0x00007f94e61941a0 id: 2, end_user_id: 1, postal_code: "1111111", address: "東京都葛飾区亀有町1−1−2", dear_name: "両津勘吉", created_at: Fri, 31 Jul 2020 16:31:39 UTC +00:00, updated_at: Fri, 31 Jul 2020 16:31:39 UTC +00:00>] のようにしっかりと登録した住所2つが格納されております
shota-imoto

2020/08/06 22:49

@end_userは格納されているようですね。@current_end_userはいかがでしょうか? current_end_user→@end_userと名前を変えたのであれば、collection_selectの記述もcurrent_end_user→@end_userと変更しましたか? @orderモデルのフォームに別モデルのオブジェクトを書いても動かない、可能性も考えられます。 その場合、 ``` <%= f.collection_select :order_address , EndUser.where(id: ○○) :id, :address , :include_blank => "選択してください" %> ``` のようにview側でDBのデータを呼び出す書き方に変更するのも試してみたいです。
takatin

2020/08/07 07:40

@end_userへとしっかりと変更しました!@orderモデルで別モデルのオブジェクトが動かない場合はどのような場合でしょうか?FKを持っていない時でしょうか。f.collection.selectの箇所をEndUser.where(id:current_end_user.id)としたところ現在ログインしているend_userのaddressが取られてきました。
shota-imoto

2020/08/07 12:29

``` <%= f.collection_select :order_address , @end_user,addresses :id, :address , :include_blank => "選択してください" %> ``` でも動きそうなものですけどね・・・。うーん。 コントローラに送信した後のparamsの中身は空なんですよね? すいません、間違えました。 ``` EndUser.where(id:current_end_user.id).addresses ``` これは効きますかねー??
takatin

2020/08/07 14:04

undefined method `addressesというエラーが出ました!これは別モデルのオブフェクトが動かないという事でしょうか?
shota-imoto

2020/08/08 06:03

うーん、アソシエーション先が呼び出せてなさそうですね。 ``` EndUser.where(id:current_end_user.id).includes(:address).addresses ``` とかでしょうか? あとはいっそ ``` Address.where(@end_user.id) ``` 基本的に@end_user.addressesとやってること同じようなものですが・・・。
takatin

2020/08/08 20:34

Address.where(end_user_id: current_end_user.id)でプルダウメニューに入りましたが、やはり Address.findでid=0のAddressは探せませんというエラーが出てしまいます。したがって、 @sta = params[:order][:order_address].to_i でparams[:order][:order_address]に値が入ってないことが要因だと思うのですが、formで送れてないのでしょうか。f.collection_select :order_addressで選択した住所が入ってはいないのでしょうか。nilではないので何かは送られているのですが、、、
takatin

2020/08/08 21:11

新しい住所先の <%= f.label :order_address, "住所" %> <%= f.text_field :order_address %> ここがあるせいでorder_addressが上書きされたことが発見できました! 長い間やりとりしていただいて本当にありがとうございました。
shota-imoto

2020/08/09 06:16

お力になれませんでしたが、良かったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問