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

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

詳細はこちら
Ruby on Rails

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

Q&A

解決済

2回答

1075閲覧

link toのオプションで値を渡し、controllerで受けたい

takatokotan

総合スコア5

Ruby on Rails

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

0グッド

1クリップ

投稿2019/12/30 12:50

前提・実現したいこと

railsでマッチングサービスのシステムを作っている初学者です。
userモデルのprofileビューに書いたlink_toをクリックした時、familyモデルのindexビューに遷移させたいのですが、その際、link_toのオプションでfamily_idを渡し、それをfamilies_controllerのindexアクションで受けたいです。

発生している問題

下記はlink_toをクリックした時のログです。きちんとfamilies_controllerのindexアクションが動作しているようですが、families_controllerのparamsでlink_toからの[:family_id]を受け取る事ができません。(families_controllerのindexアクションでparams[:family_id]の中身を調べるとnilとなります)

Started GET "/families/index" for 127.0.0.1 at 2019-12-30 20:33:39 +0900 (0.8ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC ↳ /Users/takeshi/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/log_subscriber.rb:98 Processing by FamiliesController#index as HTML

views/users/profile.html.erb

ruby

1<%= link_to("家族情報を確認する", "/families/index", family_id: @user.families.ids) %>

families_controller.rb

ruby

1def index 2 @family_date = Family.where(id: params[:family_id]) 3end

試したこと

views/users/profile.html.erbに<%= @user.families.ids %>と書くと、ブラウザ上で[5]と表示されるので、@user.families.idsにはきちんと値が入っているようです。
rails link to params 等でググりましたが解決できずこちらで質問するに至りました。

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

userモデルとfamilyモデルは1対多という関係です。

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

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

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

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

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

guest

回答2

0

ベストアンサー

1:多ですから family_id は複数あります。ので、idを渡すということは出来ないとは言いませんが素直でない。

案1)素直に user_id を渡し、User.find(params[:user_id]).families
案2) KazuSaka案の#{@user.families.ids}部分を#{@user.families.ids.join('-'} とし、cntroller側では
ids = params[:family_id].split("-") Family.where(id: ids)
とする

投稿2019/12/31 02:58

winterboum

総合スコア23567

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

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

takatokotan

2020/01/01 11:25

ご回答ありがとうございます。案1の通り、views/users/profile.html.erbを'<%= link_to("家族情報を確認する", "/families/index",user_id: @user.id) %>'とし、families_controller.rbのindexアクションに'User.find(params[:user_id]).families'と書くと、link_toをクリックした際、Couldn't find User without an IDというエラーになってしまいます。エラーの回避方法やもう少し詳細な情報を頂けると有り難いです。
winterboum

2020/01/01 21:52

routes.rbも修正しないと、params[:user_id]が得られません。やりました? get "/families/index/:user_id" => "families#index”
takatokotan

2020/01/02 08:37

修正していませんでした。でもそのように修正してlink_toをクリックするとviews/families/profile.html.erbに飛んでしまいます。なぜでしょうか。
winterboum

2020/01/02 09:00

ちょっと見てみます、 が その間に log を見ておいてください。 families#index に行く所からRender終了まで
winterboum

2020/01/02 09:02

<%= link_to("家族情報を確認する", "/families/index", family_id: @user.families.ids) %> もuser_id にしないとだめか
takatokotan

2020/01/03 22:00

logはStarted GET "/families/index" となった後で、Processing by FamiliesController#profile as HTML Parameters: {"id"=>"index"} となり、 Rendered families/profile.html.erb となっています。
winterboum

2020/01/03 23:44

Parameters: {"id"=>"index"} はおかしいですね。 config.routes.rb , 作りなおした profile.html.erbを載せてください
takatokotan

2020/01/04 06:35

config.routes.rbは get "/families/index/:user_id" => "families#index" profile .html.erbは <%= link_to("家族情報を確認する", "/families/index",user_id: @user.id) %> となっています。
winterboum

2020/01/04 07:12

config.routes.rbは全体を で。 <%= link_to("家族情報を確認する", "/families/index/#{@user.id}") %> か <%= link_to("家族情報を確認する", families_path(user_id: @user.id)) %>
guest

0

URLに仕込んでみては?

view

1<%= link_to("家族情報を確認する", "/families/index/#{@user.families.ids}") %>

routes

1get "/families/index/:family_id" => "families#index”

投稿2019/12/30 16:07

編集2019/12/30 16:09
KazuSaka

総合スコア640

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

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

takatokotan

2019/12/31 02:09

ご回答ありがとうございます。 ご提案の通りに修正し、当該link_toをクリックすると、urlがhttp://localhost:3000/families/index/[5]となり、Couldn't find Family with 'id'={:id=>"[5]"}というエラーになってしまいます。
KazuSaka

2019/12/31 03:24

winterboumさんのおっしゃる通りでした。 1:多の関係を考えてませんでした。 @user.families.idsは配列ですね。。。今回は要素1つの配列[5]なので、 Family.where(id: params[:family_id])でid=[5]がないと言われてますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問