こんな方に
- Railsでポートフォリオ作成中
- deviseを導入済み
- must existエラーが起こる
Too Long, Didn't Read
application_controller.rb
に部分的にstrong parameterを書くことで解決
環境
- MacOS Big Sur v11.2.1
- Ruby 2.6.5
- Rails 6.0.3.2
新規登録に必要な情報
Userモデルを次のコマンドで作成します。
terminal
$ rails g devise User
色々ファイルが生成されますが、その中にあるマイグレーションファイルを確認してみます。
migrate/timestamp_devise_create_users.rb
# frozen_string_literal: true
class DeviseCreateUsers < ActiveRecord::Migration[5.2]
def change
create_table :users do |t|
## Database authenticatable
t.string :email, null: false, default: ""
t.string :encrypted_password, null: false, default: ""
## Recoverable
t.string :reset_password_token
t.datetime :reset_password_sent_at
.
.
.
end
end
Database authenticableにある通り、デフォルトでは認証にemailとpasswordを必要としていることがわかりますね。
認証にnameも必要としたいので次のコマンドでusersテーブルにstring型のnameカラムを追加します。
terminal
$ rails g migration AddNameToUsers name:string
マイグレーションファイルが生成されるので次のコマンドでデータベースに反映させる。
terminal
$ rails db:migrate
これでnameカラムも追加できたし、バリデーションとフォームをちゃちゃっと設定っと!!
![スクリーンショット 2020-06-09 14.29.24.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F597061%2F7d007c14-5cec-b6c7-674e-33367df2083c.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=ac6800ea1b58b8746c9f11c2ea55d17b)
アカウントを登録!
![スクリーンショット 2020-06-09 14.30.35.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F597061%2Ffbef6f5e-32f5-67fd-aeb4-a011ae515431.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=ffa0fc022357f0e9ab832e4a2e885624)
ん?
どうやらnameがmust existとのこと。
Nameを入力しているのに値がないとは?って感じですがここでstrong parameterの存在を思い出す。
deviseを使う前までは新規登録等の機構を司るコントローラにプライベートメソッドとして記述していた記憶があったので、それに沿ってコントローラを覗いてみる。
controllers/users/registrations_controller.rb
.
.
.
# If you have extra params to permit, append them to the sanitizer.
# def configure_account_update_params
# devise_parameter_sanitizer.permit(:account_update, keys: [:attribute])
# end
.
.
.
それっぽい記述はあったけどすべてコメントアウトされていてどういうこと!?って感じだったのでdeviseのGithubを見てみるとこんな記述があった。
![スクリーンショット 2020-06-09 15.46.33.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F597061%2F33b588ac-f69b-7922-d079-26aa7e6da90f.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=ef6f5391bc7904504b5f0fcd4ac081dd)
要はapplication_controller.rb
に部分的にstrong parameterを書いてやればいいらしい。
controllers/application_controller.rb
class ApplicationController < ActionController::Base
before_action :configure_permitted_parameters, if: :devise_controller?
# ↑も記述
protected
def configure_permitted_parameters
added_attrs = [:name] #追加したparams
devise_parameter_sanitizer.permit :sign_up, keys: added_attrs
end
end
これで通ったはず、、、
![スクリーンショット 2020-06-09 15.54.54.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F597061%2Fbda6e53a-fa67-7fd9-204b-f6215bd5432e.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=0760bcfad8be3befb9dc44da3239081c)
ヤッタネ!