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

Thi*_*ent 1 attributes ruby-on-rails devise strong-parameters ruby-on-rails-4

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

为此,我将于2015年3月26日开始关注Ilya Bodrov-Krukowski的Site Point教程.

本教程教授的内容之一是如何使用附加字段创建注册表单: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
Run Code Online (Sandbox Code Playgroud)

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

实际上,我希望我的注册表格要求用户输入他们的first_name,last_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
Run Code Online (Sandbox Code Playgroud)

但是当我这样做时,我得到一个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
Run Code Online (Sandbox Code Playgroud)

但我担心现在更换默认的Devise属性(电子邮件,密码和密码确认 - 以及我忘记的其他一些属性),而不是简单地我的新属性添加到列表中.

所以,我的问题是:如何将白名单列入白名单first_name,last_name并且company_name不覆盖Devise默认属性?

jos*_*ing 6

尝试在您要添加的项目数组周围放置方括号,并将其与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
Run Code Online (Sandbox Code Playgroud)

铲子操作符只<<将一个项目添加到数组中,这就是为什么devise_parameter_sanitizer.for(:sign_up) << :first_name, :last_name, :company_name会给你一个错误,因为你传递了3个参数,而不是一个.

+运营商增加了两个数组在一起,这是我的代码片段所做的上方.

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

更新:在你的评论中,你问:"你知道我在哪里可以找到一个列表 - 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
Run Code Online (Sandbox Code Playgroud)

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

但是设计的默认值实际上除了这一点.您决定要为自己的注册表单提供哪些参数,以及自己的帐户更新操作.如果他们恰好与Devise的默认值重叠,那么很好,如果他们不这样做,那也绝对没问题.