Wizard形式 with Devise (EOTD No.10)

2 min read読了の目安(約1900字

こちら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

再び動作確認をしたところユーザー新規登録は無事成功しました!

エラーの理由

https://www.rubydoc.info/github/plataformatec/devise/ActionDispatch%2FRouting%2FMapper%3Adevise_scope

上記のページによると、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の機能がどれだけ簡潔で使いやすいかを改めて実感しました。

ライブラリを柔軟に使いこなしたい場合は、そのライブラリについてさらに理解を深める必要がある。今日の学びです。。