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_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
但我担心现在 REPLACING 默认的 Devise 属性(电子邮件、密码和密码确认 - 也许还有一些我忘记的其他属性)而不是简单的 添加我的新属性到列表中。
所以,我的问题是:如何在不覆盖 Devise 默认属性的情况下将 first_name
、last_name
和 company_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
(通常是电子邮件或用户名或您在那里配置的任何内容)加上 password
和 password_confirmation
。
但设计的默认值实际上不是重点。您正在决定 want/need 允许哪些参数用于您自己的注册表单和您自己的帐户更新操作。如果它们碰巧与 Devise 的默认值重叠,那很好,如果它们不重叠,那也绝对没问题。
作为 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_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
但我担心现在 REPLACING 默认的 Devise 属性(电子邮件、密码和密码确认 - 也许还有一些我忘记的其他属性)而不是简单的 添加我的新属性到列表中。
所以,我的问题是:如何在不覆盖 Devise 默认属性的情况下将 first_name
、last_name
和 company_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
(通常是电子邮件或用户名或您在那里配置的任何内容)加上 password
和 password_confirmation
。
但设计的默认值实际上不是重点。您正在决定 want/need 允许哪些参数用于您自己的注册表单和您自己的帐户更新操作。如果它们碰巧与 Devise 的默认值重叠,那很好,如果它们不重叠,那也绝对没问题。