Wizard形式 with Devise (EOTD No.10)
こちらAmetaです。
記念すべき第10回目のエラーはこちらです!
本日のエラー
シチュエーション
初めてお目にかかったエラーでした。
Could not find devise mapping for path "/profiles".
文面からどうやらGemの"Devise"に関するエラーのようです。
今回はDeviseを用いてウィザード形式でユーザーの新規登録を設定しようとしていました。
新規登録1ページ目の情報を保存する"Chefs"テーブルと"profiles"テーブル。
この2つのモデルには以下のようなアソシエーションを記述。
#models/profile.rb
belongs_to :chef, optional: true
#models/chef.rb
has_one :profile
chefのビューファイルからprofileのビューファイルにはうまく遷移してくれるのですが、登録を完了しようボタンを押した瞬間に今回のエラーが出てしまいました。
考察
エラー文を再度確認。
すると、エラーの原因と考えられる2つの理由両方ともにroutingに関する記述が。
速攻、routingのファイルをチェック。
#routes.rb
devise_for :users, controllers: {
sessions: 'users/sessions',
passwords: 'users/passwords',
registrations: 'users/registrations'
}
devise_for :chefs, controllers: {
sessions: 'chefs/sessions',
passwords: 'chefs/passwords',
registrations: 'chefs/registrations'
}
devise_scope :chefs do
get 'profiles', to: 'chefs/registrations#new_profile'
post 'profiles', to: 'chefs/registrations#create_profile'
end
profilesのパスに関する記述はラスト3行。ここに関して情報を探してみました。
解決
修正後のファイルがこちらです。
routes.rb
devise_scope :chef do
get 'profiles', to: 'chefs/registrations#new_profile'
post 'profiles', to: 'chefs/registrations#create_profile'
end
再び動作確認をしたところユーザー新規登録は無事成功しました!
エラーの理由
上記のページによると、routesのアクションをカスタマイズした時にはこのdevise_scope
を呼び出すのが必須らしいです。その後に重要な文言が。。
Be aware of that 'devise_scope' and 'as' use the singular form of the noun where other devise route commands expect the plural form.
他のdevise関連のルーティングでは複数形を指定してきましたが,
devise_scope
に続くのは単数形!!
ありがとうございます。。
SOTD(Summary Of The Day)
最終的に明白なリファレンスが見つかって安心しました。
今回実際にdeviseをカスタムして使ってみてdefalutの機能がどれだけ簡潔で使いやすいかを改めて実感しました。
Discussion