LoginSignup
1
2

More than 1 year has passed since last update.

【Devise】must existの対処法

Last updated at Posted at 2020-06-09

こんな方に

  • 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

アカウントを登録!

スクリーンショット 2020-06-09 14.30.35.png

ん?

どうやら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 参考:[heartcombo/devise](https://github.com/heartcombo/devise/wiki/How-To:-Allow-users-to-sign-in-using-their-username-or-email-address)

要は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

ヤッタネ!

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2