development > Ruby On Rails > deviseにもRails4のStrong Parametersを適用させる・追加する
Ruby On Rails

deviseにもRails4のStrong Parametersを適用させる・追加する

Large?1464706898

通常のコントローラーであればStrong Paramatersは

# Never trust parameters from the scary internet, only allow the white list through.
  def article_params
    params.require(:article).permit(:title, :content, :image)
  end

の様に管理できますが、deviseを使ったモデルの場合のStrong Paramatersの管理はこうやるよ、というお話です。

デフォルトで許可されているもの

deviseではデフォルトでは、

  • sign_in (Devise::SessionsController#create)の場合は"email"のみ
  • sign_up (Devise::RegistrationsController#create)の場合は"email", "password", "password_confirmation"の3つ
  • account_update (Devise::RegistrationsController#update)の場合は"email", "password", "password_confirmation", "current_password"の4つ

が許可されています。

追加方法

例えばdeviseで管理しているUserモデルにnameというカラムがあった場合、ユーザーがサインアップする際にnameを入力して欲しいし、ユーザー情報を更新する際にnameも更新できるようにしたい、というケースが出てくると思います。

その場合は、app/controllers/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
      devise_parameter_sanitizer.for(:account_update) << :name
    end
end

deviseで複数のモデルを管理している場合

deviseでUserとAdminの2つを管理している様な場合で、Userについてだけ上記のようなStrong Paramatersを追加したい場合には、独自にコントローラーを作成してapp/controllers/application_controller内で呼び出すようにします。

まず、

class User::ParameterSanitizer < Devise::ParameterSanitizer
  def sign_in
    default_params.permit(:name, :email)
  end
end

のように"name"を許可しておいて、

class ApplicationController < ActionController::Base
  protected
    def devise_parameter_sanitizer
      if resource_class == User
        User::ParameterSanitizer.new(User, :user, params)
      else
        super
      end
    end
end

resource_classがUserだった場合のみ適用させるようにします。

Small?1464706898

この記事が気に入ったらいいね!して
9bar の最新記事を受け取りましょう

Thumb?1464706898

9bar の最新記事をお届けします!

新着記事