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

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

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

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby on Rails

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

Q&A

解決済

1回答

1524閲覧

rails 複数Deviseモデルのログイン後の遷移先指定について

amonosuke

総合スコア2

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby on Rails

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

0グッド

0クリップ

投稿2021/07/24 14:50

編集2021/07/27 11:45

現在ポートフォリオ作成中ですがルーティングでつまづいたため教えていただけないでしょうか。
複数Deviseモデルのログイン後の遷移先指定で、うまくルーティングを設定できないため、pathの書き方を教えていただきたいです。

やりたいことは、Ownerログイン後に、Ownerのマイページに遷移できるようにしたいです。
(userは今後使用予定ですがまだ完成していないので一旦Ownerについて教えていただけると幸いです。)
deviseでログイン後の遷移先指定は下記のようにコントローラーに記載しています。
書き方がわからないため一旦root_pathに設定しています。

application_controller.rb def after_sign_in_path_for(resource) case resource when Owner root_path when User users_home_path end end

rootは下記のように記載していて、:idに引数が入ったhomeへ遷移したいです。

routes.rb get 'ownersinfo/:id/home' => "ownersinfo#home"

いくつかpathの設定を検索して記載してみたのですが、各々引数が必要なルーティングにしてしまったせいか、エラーが出てしまいました。
記載した内容以外で判断に必要な情報がありましたら追記いたしますのでお手数ですが教えていただけないでしょうか。

routes.rbについて省略無しで追記します。

Rails.application.routes.draw do root "home#top" get 'ownersinfo/:id/home' => "ownersinfo#home" get "ownersinfo/new" => "ownersinfo#new" get "ownersinfo/:id/edit" => "ownersinfo#edit" post "ownersinfo/:id/update" => "ownersinfo#update" post "ownersinfo/:id/reset_image" => "ownersinfo#reset_image" get "home/top" => "home#top" get "home/search" => "home#search" get "home/keyword_search" => "home#keyword_search" devise_for :owners, controllers: { sessions: 'owners/sessions', passwords: 'owners/passwords', registrations: 'owners/registrations' } devise_for :users, controllers: { sessions: 'users/sessions', passwords: 'users/passwords', registrations: 'users/registrations' } # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html end

rootは一旦アプリケーションのトップに遷移するようにしていますが、
遷移したいのは"ownersinfo#home"になります。
ownersinfo_home_path等試しましたが、引数が必要なためかルーティングがうまくいきませんでした。
他に追記する必要がある情報等ありましたらお手数ですがまた教えていただけないでしょうか。

ーーーーーーーーーーーーーーーーーーーーーーーーーー
pathhelper名ですが、_urlや_pathといったヘルパーメソッドの使い方を参考に下記のようにroutesとcontroller書き直してみました。

get "ownersinfos/:id/edit" => "ownersinfo#edit"

(ownersinfoを複数形にしました)

application_controller.rb def after_sign_in_path_for(resource) case resource when Owner edit_ownersinfo_path(:id) when User users_home_path end end

しかし上記でもNoMethodErrorと出てしまいます。root_pathにした場合動作はするので、やはりpathhelper名が間違えているようです。

rails routes で調べる方法

申し訳ありませんが上記がわからないためどのようなことをすればよいか教えていただけないでしょうか。


rails routesを実行した結果の一部を記載いたします。
何度も申し訳ありませんがご確認お願いいたします。
重要そうなところを抜粋したつもりですが抜けがありましたらおしえてください。

Controller#Action root GET / home#top GET /ownersinfo/:id/home(.:format) ownersinfo#home ownersinfo_new GET /ownersinfo/new(.:format) ownersinfo#new GET /ownersinfo/:id/edit(.:format) ownersinfo#edit POST /ownersinfo/:id/update(.:format) ownersinfo#update POST /ownersinfo/:id/reset_image(.:format) ownersinfo#reset_image home_top GET /home/top(.:format) home#top home_search GET /home/search(.:format) home#search home_keyword_search GET /home/keyword_search(.:format) home#keyword_search

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

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

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

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

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

winterboum

2021/07/24 23:42

routes.rbの root の定義を載せてください
amonosuke

2021/07/25 11:43

routes.rbについて追記いたしました。他に必要な情報等ありましたら追記いたします。
winterboum

2021/07/25 12:10

困った、何をしたいのかがわからん 「rootは下記のように記載していて、:idに引数が入ったhomeへ遷移したいです。」 として 「get 'ownersinfo/:id/home' => "ownersinfo#home"」と書いてあるのに、 routes.rbでは「root "home#top"」 routeに飛ばせるのではなく、 'ownersinfo/:id/home に行かせたい ということですか?
amonosuke

2021/07/26 03:52

左様でございます。書き方がわからないので一旦root_pathに設定しているだけです。遷移したいのは'ownersinfo/:id/home'ですが、:idに対するpathの書き方がわからずに困っています。
guest

回答1

0

ベストアンサー

get 'ownersinfo/:id/home' => "ownersinfo#home"
の pathhelper名なんだろう。
ん〜〜
rails routes で調べる方法知ってます?

投稿2021/07/26 07:26

winterboum

総合スコア23567

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

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

amonosuke

2021/07/26 13:55 編集

ご回答ありがとうございます。 pathhelperについて試したことを質問に追記いたしました。 該当しそうなことは行なったつもりですが動作しませんでした。 また申し訳ありませんが>rails routes で調べる方法 がわからないためどのようなことをすれば良いか教えていただけないでしょうか。
winterboum

2021/07/26 22:41

rails routes するとずらっと表示されますから、その中の ownersinfo#home がある行とその前数行を載せてください。あまり多量でなければ全体でも良いです。
amonosuke

2021/07/27 11:47

rails routesの結果を記載いたしました。何度も申し訳ございませんがご確認お願いします。また前回追記したpathhelperについてはhomeに移動させたいのにeditを編集するなど見当違いなことをしてしまっていたので無視してください。色々とすみません。
winterboum

2021/07/27 12:27

root GET / home#top GET /ownersinfo/:id/home(.:format) となってて /ownersinfo/:id/home(.:format) にhelperができていないですね。 ownersinfo のroutesの定義が標準とずれてるからかなぁ しかたないので get 'ownersinfo/:id/home' => "ownersinfo#home", as: "ownersinfo_home" として、 when Owner root_path のところを when Owner ownersinfo_home_path(resource)
amonosuke

2021/07/28 12:43

ご指摘の記載をしたところやりたい動作ができました。初学者の私にもわかりやすい回答で本当にありがとうございました。後ほどベストアンサーに選ばせていただくのですが最後に教えていただけないでしょうか。 pathhelperはどんなルーティングでも自動的に生成されるものだと思っていたのですが、今回のように標準的でなさそう(サポートされていない?)で、rails routesで出てこなかった場合は、pathhelperが生成されないということでしょうか。 そして今回教えていただいた ,as 〜という記載をすれば〜部分がpathhelperになるということでしょうか。 またpathhelperの後の(resource)と記載について、この記載が無いと動作しませんでしたが何故必要なのでしょうか。resourceを調べていると一つしか存在しないリソースに対して使用するメソッドと出てきましたが、controller内でも定義して使用していないのに何故(resource)と記載してうまくいったのでしょうか。自分でもよく理解できていないため質問の内容がメチャクチャでしたら申し訳ありません。
winterboum

2021/07/28 23:02

標準的では無いものでも私の経験ではつくのですが、Railsが何らかの理由で作るのを諦めたのでしょう。 rails routesで表示されない場合は、生成されない、です。 左端が空欄でもその上の行にあるhelperが該当するのでそのつもりで。 def after_sign_in_path_for(resource) ってあるので、そのresourceを使っただけです
amonosuke

2021/07/29 13:53

ありがとうございました。pathhelperが生成されなかったのはどこかしらよくないコードの書き方をしてしまっているかもしれません。 resourceについてもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問