カテゴリー:
Rails
タグ:
 Rails devise Rails4 StrongParameter

このエントリーをはてなブックマークに追加
更新日時:
2013年08月01日(木)
作成日時:
2013年08月01日(木)

前の記事 / 次の記事

参考:plataformatec/devise

Rails4でDeviseを使おうとするととりあえずStrongParameterで嵌まる。

例えばDevise用のモデルとしてUserモデルをつくって、
Deviseがデフォルト用意するカラム以外に独自のカラムを追加したい場合。

追加しようとする独自のカラムはStrongParameterで弾かれて使えない。
ので頑張って使えるようにするメモ。

っていうかplataformatec/deviseに書いてあることを日本語にしただけ。

1.アプリケーション内にDevise用モデルが一つだけある場合

または、複数あるけどその全てに同じStrongParameterを適用しても差し支えない場合。
ApplicationControllerにDevise用のStrongParameterを仕込む。

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

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:username, :email) }
  end
end

:sign_in だったらログイン時のStrongParameterを、
:sign_up だったら登録時のStrongParameterを、
:account_update だったらモデル更新時のStrongParameterを定義

詳しくはplataformatec/deviseを参照。

2.アプリケーション内にDevise用モデルが複数ある場合

で、それぞれに別々のStrongParameterを適用したい場合。

Devise用のモデルごとにStrongParameter用のクラスをつくって、
Devise用のモデルによって、適用するStrongParameter用のクラスを振り分ける。

それをApplicationControllerに仕込む。

class ApplicationController < ActionController::Base

  protected

    def devise_parameter_sanitizer
      if resource_class == User
        User::ParameterSanitizer.new(User, :user, params)
      else
        super # Use the default one
      end
    end

end

3.注意点

1.の場合でも、2.の場合でも独自のStrongParameterを定義した場合は、
デフォルトの動作に追加して設定されるのではなく、デフォルトの動作が上書きされるので、
デフォルトで通るようになっているParameterも改めて定義し直す必要がある。

デフォルトで何を通しているのかはplataformatec/deviseに書いてある。