【问题标题】:Rails 4 + Devise: how to sanitize multiple new parameters?Rails 4 + Devise:如何清理多个新参数?
【发布时间】:2015-08-26 02:33:05
【问题描述】:

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

为此,我从 2015 年 3 月 26 日起关注 Ilya Bodrov-Krukowski 的 this Site Point tutorial

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

更新相关视图后,作者解释如下:

如果您使用带有 strong_params 的 Rails(在 Rails 中启用 默认情况下为 4),需要多一步: :name 属性必须被列入白名单。

他建议使用此代码:

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

但恐怕现在替换默认的设计属性(电子邮件、密码和密码确认 - 可能还有一些我忘记的其他属性),而不是简单地添加我的新属性到列表中。

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

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 devise attributes strong-parameters


    【解决方案1】:

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

    [https://github.com/plataformatec/devise#strong-parameters4.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
    

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

    + 运算符将两个数组相加在一起,这就是我在上面的 sn-p 中所做的。

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

    更新:在您的评论中,您问:“您知道我在哪里可以找到 Devise 的默认参数列表吗?”

    它们在此处的 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

    但是 devise 的默认设置实际上并不重要。您正在决定您希望/需要允许哪些参数用于您自己的注册表单和您自己的帐户更新操作。如果它们碰巧与 Devise 的默认值重叠,那很好,如果没有,那也很好。

    【讨论】:

    • 非常感谢,您的解释很清楚。碰巧,你有一个列表——或者你知道我在哪里可以找到一个列表——Devise 的默认参数吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多