実装背景
deviseを使ったユーザー管理を実装していますが、パラメーターに親テーブルのidを渡してユーザー新規登録を実装する必要がありました。
具体的には下記のようなURLで新規登録画面を開くことを目標とします。
/admin_groups/:admin_group_id/admin_users/sign_up
該当DB
管理会社テーブル
admin_groups |
---|
name |
管理者テーブル
admin_users |
---|
name |
password |
admin_group_id |
新規登録フロー
参考までに今回実装予定の新規登録フローを紹介します。
- 既に登録されているユーザーがログインする。
- 新規ユーザー招待画面で招待したいユーザーのメールアドレスを入力、送信
- 届くメール本文には、自動で新規登録画面のURLが記載されている。
- URLのパラメータにはログインユーザーのデータに入っているadmin_group_idが自動で入り、同じ管理会社の所属になる。
ルーティングを設定
devise_for :admin_users, skip: :all #'registrations'
devise_scope :admin_user do
get '/admin_groups/:admin_group_id/admin_users/sign_up', to: 'admin_users/registrations#new', as: 'admin_user_registration'
end
1行目でadmin_usersをマッピングしています。2行目以下でregistrationsコントローラーの記述がありますので、registrationsはskipさせます。
この1行がないと、devise_mapping.validatable?の箇所でNoMethodError in Admin_Users::RegistrationsController#newエラーが出ます
2〜4行目で/admin_groups/:admin_group_id/admin_user/sign_upへアクセスされたときのコントローラーとアクションを指定します。
devise_scopeの後のadmin_userは単数系です。
複数形にすると、同様にエラーになります。
あとがき
新規登録に関してはこれでルーティングができました。
ログインに関しては親テーブル関係なく、admin_users/sign_inで行いたいので下記に手順を書きました。
Railsのdeviseで新規登録画面URLは親テーブルのidを渡し、ログインURLには渡さない