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

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

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

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

Ruby on Rails

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Q&A

解決済

1回答

2095閲覧

rails form_for selectメソッド内のカラムaddressがparamsに取得されない

railsganbaruman

総合スコア16

Ruby

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

Ruby on Rails

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

1グッド

0クリップ

投稿2020/09/09 13:23

編集2020/09/09 15:08

前提・実現したいこと

for_forで保存済みの住所から住所を選択しパラメータにidを送りたい。
paramsがうまくいっていないのでorderの保存処理saveはまだ実装してません。
paramsが取得できていない理由を知りたいです。
必要な情報がありましたらコメントでお知らせいただけると嬉しいです、更新させていただきます。

schema.rbより関連モデルのカラム

create_table "addresses", force: :cascade do |t| t.integer "end_user_id", null: false t.string "postal_code", null: false t.string "address", null: false t.string "name", null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false end create_table "end_users", force: :cascade do |t| t.string "email", default: "", null: false t.string "encrypted_password", default: "", null: false t.string "reset_password_token" t.datetime "reset_password_sent_at" t.datetime "remember_created_at" t.string "last_name" t.string "first_name" t.string "last_name_kana" t.string "first_name_kana" t.string "postal_code" t.string "address" t.string "telephone_number" t.boolean "is_active", default: true t.datetime "created_at", null: false t.datetime "updated_at", null: false t.index ["email"], name: "index_end_users_on_email", unique: true t.index ["reset_password_token"], name: "index_end_users_on_reset_password_token", unique: true end create_table "orders", force: :cascade do |t| t.integer "end_user_id", null: false t.string "postcode", null: false t.string "address", null: false t.string "delivery_name", null: false t.integer "postage", null: false t.integer "total_fee", null: false t.integer "payment", default: 0, null: false t.integer "orders_status", default: 0, null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false end ``` **関連モデル** 今回関係しそうなモデルのリレーション: **end_user**と**order**と**address** ``````ここに言語を入力 class EndUser < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable validates :last_name, :last_name_kana, :first_name, :first_name_kana, :postal_code, :address, :telephone_number, presence: true has_many :cart_items has_many :orders         has_many :addresses def active_for_authentication? super && (self.is_active == true) end end ``` ``` class Order < ApplicationRecord belongs_to :end_user enum payment:{ cash: 0, credit: 1 } enum orders_status:{ waiting_for_payment: 0, confirmation_payment: 1, preparing_for_shipping: 2, sent: 3, arrival: 4 } attr_accessor :address_option end ``` ```ここに言語を入力 class Address < ApplicationRecord belongs_to :end_user end ``` **orderコントローラー** ```ここに言語を入力 class EndUsers::OrdersController < ApplicationController before_action :cart_item_exist? def new @order = Order.new end def confirm end def complete end def create (中略)    binding.pry (中略) redirect_to items_path end def index end def show end private def cart_item_exist? if current_end_user.cart_items.empty? redirect_to end_users_cart_items_path, notice: 'カートが空です' end end def order_params # params[:order][:payment]=params[:order][:payment].to_i params.require(:order).permit(:end_user_id, :postcode, :address, :delivery_name, :payment, :address_option) end end ``` **views/orders/new.html.erb**  フォームのビュー画面 ``` <%= form_for @order,url: end_users_orders_path do |f| %> <%= render 'layouts/error', model: f.object %> <%= f.hidden_field :end_user_id, :value => current_end_user.id %> <%= f.radio_button :payment, 0, checked: "checked" %> <%= f.label "現金" %> <%= f.radio_button :payment, 1 %> <%= f.label "クレジットカード" %> <br> <%= f.label :address, "お届け先" %> <br> <%= f.radio_button :address_option, 0, checked: "checked" %>ご自身の住所 <br> <%= current_end_user.address %> <br> <%= f.radio_button :address_option, 1 %> <%= f.label :address, '登録済み住所から選択' %><br> <%= f.select :address, current_end_user.addresses.map{|a| [a.address,a.id]}, {prompt: "選択してください"} %> <br> <%= f.radio_button :address_option, 2 %>新規住所 <br> <%= f.label :postcode,"郵便番号" %> <br> <%= f.text_field :postcode %> <br> <%= f.label :address, "住所"%> <br> <%= f.text_field :address %> <br> <%= f.label :delivery_name,"宛名" %><br> <%= f.text_field :delivery_name %> <br> <%= f.submit "確認画面へ進む",class:"btn btn-primary" %> <% end %> ``` ### 発生している問題・エラーメッセージ createアクション内でbinding.pryにより以下を試しました。 ![イメージ説明](7303c4bbe84ba6b1c0341e31b017ebe0.png) params[:order][:address]が空になってしまっている。 ![イメージ説明](c7df8e14baee4afb2924f13e5b5cb9cd.png) セレクトメソッド内の配列は適切に作られているように見えます。 string型のaddressにidをいれようとしてるからかと思い、 ```hoge.rb current_end_user.addresses.map{|a| [a.address,a.id.to_s]}, ``` としても状況変わらずでした。 また、rails sで立ち上げて問題のビューページで検証しました。 ![イメージ説明](3e74ba20d4b2a202905171ef7013d125.png) セレクトフォームのhtml翻訳後もうまく行ってそうな気がしてます。。 ### 補足情報(FW/ツールのバージョンなど) Rails 5.2.4.3 追記 ![イメージ説明](475cf76a86d9233fed87abcc2a1ef146.png)
necocoa👍を押しています

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

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

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

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

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

winterboum

2020/09/09 13:31

EndUserのaddressは integerのaddress_idにしたほうがよいと思うのですが、そうしない理由ってあります?
railsganbaruman

2020/09/09 15:15 編集

コメントありがとうございます。 補足情報に追加の画像をアップロードさせていただきました。new.htmlの画面です。 ラジオボタンで条件分岐して以下のことをしようとしているためstringにしています。 EndUserのカラムaddressでorder.addressを登録する Addressのカラムから選択してorder.addressを登録する 新しいAddressモデルを作成する。さらに、それをorder.addressとして登録する
guest

回答1

0

ベストアンサー

<%= f.label :address, '登録済み住所から選択' %><br> <%= f.select :address, current_end_user.addresses.map{|a| [a.address,a.id]}, {prompt: "選択してください"} %> <br> <%= f.radio_button :address_option, 2 %>新規住所 <br> <%= f.label :postcode,"郵便番号" %> <br> <%= f.text_field :postcode %> <br> <%= f.label :address, "住所"%> <br> <%= f.text_field :address %> <br>

addressが2つ存在するため、後者のtext_fieldのaddressがパラメータに送られているのだと思います。

投稿2020/09/09 16:35

necocoa

総合スコア209

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

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

railsganbaruman

2020/09/10 08:03

確認したところおっしゃるとおりでした。 大変助かりました。ベストアンサーとさせていただきます。 ご回答ありがとうございました。 また機会があればよろしくおねがいします!
necocoa

2020/09/10 09:19

ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問