スタブ。

スタブ=スタディブログ

deviseでmigrationファイルにカラムを増やした時の注意点だよ!

rails g devise User

を実行するとmigrationファイルが作られるが、デフォルトではemail、password(など)のみでnameも登録する時に必要な場合はmigrationファイルに自分でnameカラムを追加する必要がある。

migrationファイルにnameカラムを追加し、rake db:migrateも行い、新規登録のnew.html.erbにもnameを入力するフォームを追加し準備万端!早速、新規登録をしてみようと名前、メールアドレス、パスワードを入力して登録ボタンをクリック…

すると、まさかのエラー。

Parameters: {"utf8"=>"✓", "authenticity_token"=>"xxxxxxxx", "user"=>{"name"=>"takenoko", "email"=>"takenoko@example.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Sign up"}
Unpermitted parameters: name

Unpermitted parameters: name→許可されていないパラメータ: 名前


自分で追加したカラムの値も保存するには、一手間必要。

application_controllerに以下を追記。

class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) << :name(自分で追加したカラム名)
  end
end

【追記】 rake testを行ったところ、以下のWARNINGが発生。

DEPRECATION WARNING: [Devise] Changing the sanitized parameters through "Devise::ParameterSanitizer#for(sign_up) is deprecated and it will be removed from Devise 4.2.
Please use the `permit` method to add or remove any key:

  To add any new key, use the `keys` keyword argument:
  devise_parameter_sanitizer.permit(:sign_up, keys: [:param1, :param2, :param3])

  To remove any existing key, use the `except` keyword argument:
  devise_parameter_sanitizer.permit(:sign_up, except: [:email])
 (called from configure_permitted_parameters at /Users/~~~~~/~~~~~/~~~~~/~~~~~/controllers/application_controller.rb)

訳:

キーを追加する場合はkeysというキーワード引数を、

キーを削除する場合はexceptというキーワード引数を使用します。

なので、

devise_parameter_sanitizer.for(:sign_up) << :name

devise_parameter_sanitizer.permit(:sign_up, keys: [:name])

変更。