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_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
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默认属性?
尝试在您要添加的项目数组周围放置方括号,并将其与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(通常是电子邮件或用户名或你在那里配置的任何东西)加上 password和password_confirmation.
但是设计的默认值实际上除了这一点.您决定要为自己的注册表单提供哪些参数,以及自己的帐户更新操作.如果他们恰好与Devise的默认值重叠,那么很好,如果他们不这样做,那也绝对没问题.
| 归档时间: |
|
| 查看次数: |
1256 次 |
| 最近记录: |