56

我已将设计添加到我的 Rails 4 应用程序中,并成功地将用户名等添加到我的用户模型中。此外,我可以使用惰性方式存储这些字段™,即

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

但这并没有像预期的那样工作(用户名在被编辑操作调用时没有被存储)。为了让它发挥作用,我还需要做些什么吗?谢谢!

4

4 回答 4

91

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

神奇的词是: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

请注意,如果您从事使用非标准参数登录的业务,那么您要查找的词是:sign_in(如预期的那样)。

于 2013-11-05T16:05:16.303 回答
70

对于设计 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用于创建新的设计资源(例如用户),:account_update用于编辑/更新资源。

第二个参数:keys包含您允许的参数数组。

如果你愿意nested_attributes,有一个例子:account_update,你可以在其中放置一个单独的数组,其中的键是<object>_attributes

于 2016-06-12T22:54:51.287 回答
16

@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
于 2014-04-18T17:20:25.937 回答
7
def configure_permitted_parameters
  devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:email,   :password, :password_confirmation, :current_password, :firstname, :middlename, :lastname, :nickname) }
end
于 2015-01-18T19:10:59.323 回答