web-dev-qa-db-ja.com

編集アクションにdevise_parameter_sanitizerを指定する方法は?

DeviseをRails 4アプリケーションに追加し、ユーザーモデルにユーザー名などを追加しました。さらに、lazy way™を使用してこれらのフィールドを保存できます。

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

  protected

    def configure_permitted_parameters
      devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:email, :password, :password_confirmation, :firstname, :middlename, :lastname) } 
    end
end

しかし、私は試しました

def configure_permitted_parameters
  devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:email, :password, :password_confirmation, :firstname, :middlename, :lastname) }
  devise_parameter_sanitizer.for(:edit) { |u| u.permit(:email, :password, :password_confirmation, :firstname, :middlename, :lastname) }
end

しかし、それは期待どおりに機能しませんでした(編集アクションによって呼び出されたときにユーザー名が保存されていません)。それを機能させるために私がしなければならないことは他にありますか?ありがとう!

50
conciliator

もう一度、それはマニュアルを読むことの問題でした...

魔法の言葉は:account_updateしたがって、作業バージョンは

def configure_permitted_parameters
  devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:email, :password, :password_confirmation, :firstname, :middlename, :lastname, :nickname) }
  devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:email, :password, :password_confirmation, :current_password, :firstname, :middlename, :lastname, :nickname) }
end

非標準のパラメータを使用してサインインする場合は、探しているWordは:sign_in (予想通り)。

85
conciliator

Devise 4.1+の場合

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

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:first_name, :last_name, :email])
    devise_parameter_sanitizer.permit(:account_update, keys: [:first_name, :last_name, :phone, :email, bank_attributes: [:bank_name, :bank_account]])
  end
end

.forメソッドは廃止されました。現在は.permitを使用しています

最初の引数はアクション名です。 :sign_upは新しいDeviseリソース(ユーザーなど)を作成するためのものであり、:account_updateはリソースを編集/更新するためのものです。

2番目の引数:keysには、許可するパラメーターの配列が含まれます。

nested_attributesが必要な場合は、:account_updateに例があります。キーが<object>_attributesである別の配列を配置します。

54
Mirror318

@conciliatorは魔法のWordについて正しいです:account_updateですが、ここに彼が示唆したドキュメントへのリンクがあります http://rubydoc.info/github/plataformatec/devise/ 「devise_parameter_sanitizer」と「あなた」以下が表示されます。

Deviseには3つのアクションがあり、パラメーターのセットをモデルに渡すことができるため、サニタイズが必要です。それらの名前とデフォルトで許可されるパラメーターは次のとおりです。

sign_in (Devise::SessionsController#new) - Permits only the authentication keys (like email)
sign_up (Devise::RegistrationsController#create) - Permits authentication keys plus password and password_confirmation
account_update (Devise::RegistrationsController#update) - Permits authentication keys plus password, password_confirmation and current_password
15
techbrownbags
def configure_permitted_parameters
  devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:email,   :password, :password_confirmation, :current_password, :firstname, :middlename, :lastname, :nickname) }
end
6
lypef