在 Rails 中,如何在没有警告的情况下对现有模型对象进行质量分配?
In Rails, how can a mass-assignment be made to an existing model object without warnings?
在 Rails 应用程序中,可以将 params
中的一些值分配给现有模型对象,如下所示:
model.attributes = params
这显然会 return 一个 ForbiddenAttributesError
但可以这样避免:
model.attributes = params.permit(:a, :b, :c)
然而,尽管这有效,但如果 params
包含在对 permit
的调用中未提及的密钥,它仍会向控制台输出一条消息:
Unpermitted parameters: d, e, f
该警告毫无意义,因为已经知道 params
包含其他键,并且 permit
正用于 select 所需的子集。可以通过
来避免
model.attributes = params.slice(:a, :b, :c).permit!
是否有更合适的方法来执行此分配,不需要先 slice
哈希?
The warning is pointless because it's already known that params contains additional keys and permit is being used to select the required subset.
您误解了此警告的目的。当你调试为什么你的表单没有更新你今天添加的这个新字段时,这是非常有价值的。有了警告,查看服务器日志您可以很快发现您忘记更新 strong_params 过滤。
此外,警告只会在 dev/test 环境中显示。它不会出现在生产中。
但是假设您真的讨厌那个警告。在这种情况下,您可以在您的应用配置中执行此操作:
# possible values: :raise, :log
config.action_controller.action_on_unpermitted_parameters = false
顺便说一句,你的代码有点不正统。常见的方法是将过滤代码保留在一个方法中,并从 create/update (以及您需要的任何其他地方)
调用它
def update
@product = ...
if @product.update_attributes(product_params)
...
else
...
end
end
private
def product_params
params.require(:product).permit(:a, :b, :c)
end
在 Rails 应用程序中,可以将 params
中的一些值分配给现有模型对象,如下所示:
model.attributes = params
这显然会 return 一个 ForbiddenAttributesError
但可以这样避免:
model.attributes = params.permit(:a, :b, :c)
然而,尽管这有效,但如果 params
包含在对 permit
的调用中未提及的密钥,它仍会向控制台输出一条消息:
Unpermitted parameters: d, e, f
该警告毫无意义,因为已经知道 params
包含其他键,并且 permit
正用于 select 所需的子集。可以通过
model.attributes = params.slice(:a, :b, :c).permit!
是否有更合适的方法来执行此分配,不需要先 slice
哈希?
The warning is pointless because it's already known that params contains additional keys and permit is being used to select the required subset.
您误解了此警告的目的。当你调试为什么你的表单没有更新你今天添加的这个新字段时,这是非常有价值的。有了警告,查看服务器日志您可以很快发现您忘记更新 strong_params 过滤。
此外,警告只会在 dev/test 环境中显示。它不会出现在生产中。
但是假设您真的讨厌那个警告。在这种情况下,您可以在您的应用配置中执行此操作:
# possible values: :raise, :log
config.action_controller.action_on_unpermitted_parameters = false
顺便说一句,你的代码有点不正统。常见的方法是将过滤代码保留在一个方法中,并从 create/update (以及您需要的任何其他地方)
调用它def update
@product = ...
if @product.update_attributes(product_params)
...
else
...
end
end
private
def product_params
params.require(:product).permit(:a, :b, :c)
end