🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails

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

Q&A

解決済

2回答

975閲覧

Ruby on Railsで都道府県毎にデータを持たせたい

shin342

総合スコア22

Ruby on Rails

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

0グッド

0クリップ

投稿2020/11/26 04:12

前提・実現したいこと

WEB幹事やhomesのように都道府県の一覧ページがあり、各都道府県に会社の情報を持たせたいと考えています。
都道府県をリンクにして、持たせたデータを一覧で表示させる感じです。
都道府県はPrefectureモデルで各データはCompanyモデルとしています。
PrefectureとCompanyモデルは1対Nでアソシエーションを組んでます。
会社情報の送信時にエラーが出現してしまい、controllerにどのように記述すればPrefectureのidを取得できるのかわかりませんでした。
都道府県情報はPrefectureモデルにenumで記述しています。
データ自体はseedsに直接記述しています。
エラーメッセージ以外にも設計について、こうした方が良いなどありましたらご教示ください。イメージ説明

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

Couldn't find Prefecture without an ID

該当のソースコード

Prefecture.index

<%= form_for(@company ,url: admins_companies_path) do |f| %> <%# <%= f.hidden_field :prefecture_id ,:value => @prefectures.id %> <div class="company-post__title"> <h2>掲載企業を追加</h2> </div> <div class="company-post__prefectures"> <p>都道府県を選択</p> <%= f.select :prefecture_id, Prefecture.prefecture_names %> <%# <%= f.select :prefecture_id, options_for_select(Prefecture.prefecture_names) %> <p>会社名を記入</p> <%= f.text_field :company_name %> <p>説明文を記入</p> <%= f.text_area :description %> <div> <%= f.attachment_field :image %> </div> </div> <%= f.submit 'Create Company' %> <% end %>
class Admins::CompaniesController < ApplicationController def index end def show end def create @prefecture = Prefecture.find(params[:prefecture_id]) company = @prefecture.companies.new(company_params) # company.prefecture_id = @prefecture.id if company.save lash[:notice] = 'successfully' redirect_to admins_prefectures_path end end def edit end def updata end def destroy end private def company_params params.require(:company).permit(:company_name, :description, :image) end end
class Admins::PrefecturesController < ApplicationController def index @company = Company.new end def show @prefecture = Prefecture.find(params[:id]) @companies = @prefecture.companies end end

Prefecture.rb

class Prefecture < ApplicationRecord has_many :companies, dependent: :destroy enum prefecture_name:{ "---":0, 北海道:1,青森県:2,岩手県:3,宮城県:4,秋田県:5,山形県:6,福島県:7, 茨城県:8,栃木県:9,群馬県:10,埼玉県:11,千葉県:12,東京都:13,神奈川県:14, 新潟県:15,富山県:16,石川県:17,福井県:18,山梨県:19,長野県:20, 岐阜県:21,静岡県:22,愛知県:23,三重県:24, 滋賀県:25,京都府:26,大阪府:27,兵庫県:28,奈良県:29,和歌山県:30, 鳥取県:31,島根県:32,岡山県:33,広島県:34,山口県:35, 徳島県:36,香川県:37,愛媛県:38,高知県:39, 福岡県:40,佐賀県:41,長崎県:42,熊本県:43,大分県:44,宮崎県:45,鹿児島県:46, 沖縄県:47 } end

route

namespace :admins do resources :prefectures,only: [:index, :show, :create ] resources :companies end

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

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

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

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

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

guest

回答2

0

ベストアンサー

params[:prefecture_id]が空に見えます。
フォームから送信された値はparams[:company][:prefecture_id]に入っているはずなので、

ruby

1@prefecture = Prefecture.find(params[:company][:prefecture_id])

自分ならcompany_paramsprefecture_idを含めます。

ruby

1def create 2 company = Company.new(company_params) 3 if company.save 4 lash[:notice] = 'successfully' 5 redirect_to admins_prefectures_path 6 end 7end 8 9def company_params 10 params.require(:company).permit(:company_name, :description, :image, :prefecture_id) 11end

投稿2020/11/26 04:28

neko_daisuki

総合スコア2090

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

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

shin342

2020/11/26 05:34

おっしゃる通り、company_paramsに:prefecture_idを入れることで解決しました。 ありがとうございました。 また、「params[:prefecture_id]が空に見えます。 フォームから送信された値はparams[:company][:prefecture_id]に入っているはずなので、」 とおっしゃっておりましたが、prefecture_idが空だとわかった理由と、params[:company][:prefecture_id]に値が入っている理由を教えて頂けますでしょうか。 ここら辺の考え方がわからず、毎回戸惑ってしまいます。
neko_daisuki

2020/11/26 13:54

投稿されたエラーメッセージの画像の下の方にあるParametersを見ました。 params[:prefecture_id]という名前の値は、 routes.rb で resources をネストすると現れることがことがあるので、 routes.rb と view から推測することもできます。
guest

0

会社情報の送信時にエラーが出現してしまい、controllerにどのように記述すればPrefectureのidを取得できるのかわかりませんでした。

その必要自体がないのではないでしょうか。単純にprefecture_idを入れたCompanysaveすれば、あとからPrefecture#companiesでリストアップできます。

投稿2020/11/26 04:15

maisumakun

総合スコア145967

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

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

shin342

2020/11/26 05:38

ご回答ありがとうございました。 確かにidを取得する記述は不要でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問