devise-如何为编辑操作指定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

但这不能按预期方式工作(当用户通过edit动作调用时未存储用户名)。 为了使它正常工作,我还需要做其他事情吗? 谢谢!

4个解决方案
85 votes

再一次,这是阅读手册的问题...

魔术字是:sign_in,因此工作版本变为

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

请注意,如果您要使用非标准参数登录,则您要查找的单词是:sign_in(按预期)。

conciliator answered 2020-01-26T12:01:35Z
54 votes

对于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

不建议使用nested_attributes方法,现在我们使用:account_update

第一个参数是动作名称。 nested_attributes用于创建新的Devise资源(例如用户),:account_update用于编辑/更新资源。

第二个参数nested_attributes包含允许的参数数组。

如果要nested_attributes,则在:account_update中有一个示例,您将一个单独的数组放入其中,键为<object>_attributes

Mirror318 answered 2020-01-26T12:02:13Z
15 votes

@conciliator关于魔术字是正确的:account_update,但这是他提到的文档的链接[http://rubydoc.info/github/plataformatec/devise/]搜索“ devise_parameter_sanitizer”,您将看到以下内容:

在Devise中,只有三个动作可以将任何参数集传递给模型,因此需要进行清理。 它们的名称和默认允许的参数是:

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
techbrownbags answered 2020-01-26T12:02:38Z
6 votes
def configure_permitted_parameters
  devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:email,   :password, :password_confirmation, :current_password, :firstname, :middlename, :lastname, :nickname) }
end
lypef answered 2020-01-26T12:02:54Z
translate from https://stackoverflow.com:/questions/19791531/how-to-specify-devise-parameter-sanitizer-for-edit-action