代码之家  ›  专栏  ›  技术社区  ›  Thibaud Clement

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

  •  1
  • Thibaud Clement  · 技术社区  · 10 年前

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

    为此,我遵循 this Site Point tutorial Ilya Bodrov Krukowski,2015年3月26日。

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

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

    如果您使用的是具有strong_param(在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_name , last_name company_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属性(电子邮件、密码和密码确认,可能还有我忘记的其他属性),而不是简单地 添加 我的新属性添加到列表中。

    所以,我的问题是:我如何才能进入白名单 第一个名称 , 姓氏 公司名称 而不覆盖Devise默认属性?

    1 回复  |  直到 10 年前
        1
  •  7
  •   blnc Marcus Walser    9 年前

    尝试在要添加的项目数组周围放置方括号,并将其与 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个参数,而不是一个。

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

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

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

    它们在github repo中定义如下: 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 (通常是电子邮件或用户名或您在那里配置的任何内容)加 password password_confirmation .

    但事实上,design的违约并不重要。您正在决定您希望/需要为自己的注册表单和帐户更新操作允许哪些参数。如果它们恰好与Devise的默认值重叠,那很好,如果它们不重叠,那也很好。