Rails 4 + Devise:如何清理多个新参数?

Rails 4 + Devise: how to sanitize multiple new parameters?

作为 Rails 的新手,我正在学习如何实施 Devise。

为此,我从 2015 年 3 月 26 日开始关注 this Site Point tutorial 作者 Ilya Bodrov-Krukowski。

本教程教授的内容之一是如何创建带有附加字段的注册表单:name

更新相关观点后,作者解释如下:

If you are using Rails with strong_params (which are enabled in Rails 4 by default), one more step is needed: the :name attribute has to be whitelisted.

他推荐此代码:

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

这工作得很好......但我的问题是我想在注册表单中添加多个新字段。

确实,我希望我的注册表要求用户输入他们的 first_namelast_namecompany_name

我更新了我的视图,我在表单中得到了正确的字段。

然而,到目前为止,我还没有能够将这三个属性列入白名单。

我试过:

before_action :configure_permitted_parameters, if: :devise_controller?

    protected

    def configure_permitted_parameters
      devise_parameter_sanitizer.for(:sign_up) << :first_name, :last_name, :company_name
      devise_parameter_sanitizer.for(:account_update) << :first_name, :last_name, :company_name
    end

但是当我这样做时,我得到一个 unexpected "," 错误。

我也试过:

before_action :configure_permitted_parameters, if: :devise_controller?

    protected

def configure_permitted_parameters
  devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:first_name, :last_name, :company_name) }
  devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:first_name, :last_name, :company_name) }
end

但我担心现在 REPLACING 默认的 Devise 属性(电子邮件、密码和密码确认 - 也许还有一些我忘记的其他属性)而不是简单的 添加我的新属性到列表中。

所以,我的问题是:如何在不覆盖 Devise 默认属性的情况下将 first_namelast_namecompany_name 列入白名单?

尝试将方括号括在您要添加的项目数组中,并将其与 keys: 键和 permit 一起使用,而不是 for:

[https://github.com/plataformatec/devise#strong-parameters 4.2.x 4.3.x

def configure_permitted_parameters
  devise_parameter_sanitizer.permit(:sign_up, keys: [:first_name, :last_name, :company_name])
  devise_parameter_sanitizer.permit(:account_update, keys: [:first_name, :last_name, :company_name])
end

铲子运算符 << 仅将单个项目添加到数组中,这就是 devise_parameter_sanitizer.for(:sign_up) << :first_name, :last_name, :company_name 给您错误的原因,因为您向它传递了 3 个参数,而不是一个。

+ 运算符将两个数组相加,这就是我在上面的代码片段中所做的。

但就我个人而言,我只是使用你给出的最后一个例子(传入一个块)并手动包含你想要的所有字段,包括设计的默认值,如果你正在使用它们。

更新:在你的评论中,你问:"do you know where I can find a list — of Devise's defaults parameters?"

它们在此处的 github 存储库中定义:https://github.com/plataformatec/devise/blob/master/lib/devise/parameter_sanitizer.rb#L83-L92

这里是相关代码:

def attributes_for(kind)
  case kind
  when :sign_in
    auth_keys + [:password, :remember_me]
  when :sign_up
    auth_keys + [:password, :password_confirmation]
  when :account_update
    auth_keys + [:password, :password_confirmation, :current_password]
  end
end

所以,这是您的 auth_keys(通常是电子邮件或用户名或您在那里配置的任何内容)加上 passwordpassword_confirmation

但设计的默认值实际上不是重点。您正在决定 want/need 允许哪些参数用于您自己的注册表单和您自己的帐户更新操作。如果它们碰巧与 Devise 的默认值重叠,那很好,如果它们不重叠,那也绝对没问题。