旧gaaamiiのブログ

間違ったことを書いている時があります。コメントやTwitter、ブコメなどでご指摘ください

Deviseで作ったUserモデルにnameカラムを追加しようとしたらstrong_parametersに阻まれた時の対処

ググって見つかった記事(Rails Deviseでサインアップ用のユーザー登録フォームに、独自の入力フィールドを追加する | EasyRamble)とかを参考にして「ああこれなら簡単そう」だと思ってたんだけど気づいたらけっこうな時間ハマってた。

原因はRails4からのstrong_parameters。

deviseで作ったユーザーモデルにnameカラムを追加しようと思って、rails g migration AddNameToUsersとかやって、ビューにフォーム用意して、いざサインアップしようとしたら以下の様なエラー。

Processing by Devise::RegistrationsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"xxxxxxxx", "user"=>{"name"=>"gaaamii", "email"=>"gaaamii@example.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Sign up"}
Unpermitted parameters: name

Unpermitted parametersですって。そうかそうか。勝手に追加した値を受け入れてくれるわけないっすよねー。えへへ。とはいってもdeviseが生成したコントローラ、どうやって書き換えるの...?

...と、調べてみるとdeviseのREADMEにちゃんと書いてあった。

In case you want to permit additional parameters (the lazy way™) you can do with a simple before filter in your ApplicationController.

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

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) << :username
  end
end