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

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

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

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

Q&A

解決済

1回答

212閲覧

関連付け:belongs_toに基づくモデル作成ができない

innjera

総合スコア132

Ruby on Rails 5

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

0グッド

1クリップ

投稿2019/01/23 05:29

前提

TenderTenderLocationモデルがあり、双方はTender belongs_to TenderLocationTenderLocation has_many Tendersで関連づけています。感覚的にhas_manybelongs_toが逆と思われると思いますが、これで正しいです。各々のmodelとtableは以下の通りです。(本質問に関係ない情報は消去してます)。

間接的なこととして、Sellerモデルも存在し、Seller has_many Tenders / Tender Locationsとなっています。

ruby

1###Tender Model 2# 3# Table 4# 5# id :bigint(8) not null, primary key 6# seller_id :bigint(8) not null 7# tender_location_id :bigint(8) not null 8# starts_at :datetime not null 9# ends_at :datetime not null 10# status :string default("draft"), not null 11# created_at :datetime not null 12# updated_at :datetime not null 13# 14 15class Tender < ApplicationRecord 16 belongs_to :seller 17 belongs_to :tender_location 18 19 STATUS_VALUES = %w(draft ready) 20 21 ##色々省略## 22 23end 24 25 26###TenderLocation Model 27# == Schema Information 28# 29# Table name: tender_locations 30# 31# id :bigint(8) not null, primary key 32# seller_id :bigint(8) not null 33# address :string not null 34# address_country_part :string default("Japan"), not null 35# address_prefecture_part :string not null 36# address_city_part :string not null 37# address_rest_part :string not null 38# created_at :datetime not null 39# updated_at :datetime not null 40# 41 42class TenderLocation < ApplicationRecord 43 has_many :tenders 44 45end 46

今起きている問題

Tenderモデルを新規作成する際に、Tender Locationをユーザーに選択(新規作成てはなく、既存の TenderLocationから選んでもらう)。

で、以下のようにcontrollerを記載しています。

ruby

1def new 2 @tender = Tender.new 3 time0 = Time.current.beginning_of_day 4 @tender.starts_at = time0.advance(days: 1, hours: 9) 5 @tender.ends_at = time0.advance(days: 3, hours: 12) 6 @tender_location_candidates = current_seller.tender_locations 7 end 8 9 def create 10 @tender = Tender.new(tender_params) 11 binding.pry 12 @tender.seller = current_seller 13 tender_location = TenderLocation.find_by(id: tender_location_id) 14 @tender.tender_location = tender_location 15 if @tender.save 16 flash.notice = "入札会を設定しました。掲載商品を追加してください。" 17 redirect_to sellers_tender_path(@tender) 18 else 19 render "new" 20 end 21 end 22 23 private def tender_params 24 params[:tender].permit( 25 :seller_id, :tender_location_id, 26 :starts_at_date_part, :starts_at_time_part, 27 :ends_at_date_part, :ends_at_time_part, 28 :status 29 ) 30 end 31

フォームはこちら

erb

1 2<%= form_for @tender, url: :sellers_tenders do |f| %> 3 4<%= f.label :starts_at_date_part, "入札「開始」日"%> 5 6 間省略 7 8<%= f.select :status, Tender.status_options, {}, class: 'form-control' %> 9<%= f.label :tender_location_id, "開催場所" %> 10<%= select_tag :tender_location_id, options_from_collection_for_select(@tender_location_candidates.all, :id, :address), class: 'form-control' %> 11 12<%= f.submit "入札を開始する", class: 'btn btn-success' %> 13

その結果のコンソール/ログが以下の通りです。おかしいと思うのが、
0. デバックにてtender_paramsを入れると、tender_location_idが入っていないこと
0. コンソールのログを見ると、"tender_location_id"=>"5"とあるものの、"tender"=>{---省略---}の外にきていること

ruby

1###コンソールのログ 2Parameters: {"utf8"=>"✓", "authenticity_token"=>"-省略-", 3"tender"=>{"starts_at_date_part"=>"2019-01-26", "starts_at_time_part"=>"09:00", 4 "ends_at_date_part"=>"2019-01-26", "ends_at_time_part"=>"12:00", 5"status"=>"draft"}, "tender_location_id"=>"5", "commit"=>"入札を開始する"} 6 7###binding.pryにて 8pry(#<Sellers::TendersController>)> tender_params 9=> <ActionController::Parameters {"starts_at_date_part"=>"2019-01-26", "starts_at_time_part"=>"09:00", "ends_at_date_part"=>"2019-01-26", "ends_at_time_part"=>"12:00", "status"=>"draft"} permitted: true>

解決策わからず、ご教示いただけますと助かります。

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

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

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

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

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

guest

回答1

0

ベストアンサー

手が空きましたのでtwitterで回答したものを転載しておきます。

引き続き問題がありましたらご質問ください

select_tagではなくf.selectであれば第一引数はプロパティ名で問題ありません。
select_tagの場合、第一引数を要素名にする必要があります。
'tender[tender_location_id]'で、paramsまでわたってきました。

質問内容のコードでは、formのtenderに関連付けて渡せていなかったようです。

上記検証に必要な最低限のカラムだけで試したため、paramsに渡せてもその後で問題があるかもしれません。

その場合、その旨追記お願いします

投稿2019/01/23 08:23

sansansandodo

総合スコア248

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

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

innjera

2019/01/23 11:22

ご丁寧に有難う御座いました!ご回答頂いたやり方に修正したところ、無事に通りました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問