Rails 4.2.4 params.permit!无法忽略表单中的 utf 字段
Rails 4.2.4 params.permit! fails to ignore utf field in form
在我们不关心质量分配的脚手架表单的仅限管理员的控制器中,我们仅使用许可就实现了强参数!方法(没有 .require() 或 .permit() )应该简单地将 params 允许标志设置为 true,将 params 对象中的任何内容列入白名单。
private
def foo_params
params.permit!
end
在控制器中我们有
def create
@foo = Foo.new(foo_params)
然而,在规范中和 运行 应用程序时,控制器的创建方法抛出异常:
unknown attribute 'utf8' for Foo
如果我们添加 .require(:MODEL) 错误消失,例如更改 foo_params
private
def foo_params
params.require(:foo).permit!
end
是否需要 .require() 来避免由于某些神奇添加的 Rails 表单属性(如 utf8 属性)而引发异常?
(如果它有任何不同,它是一个从 Rails 3.2 升级到 4.2 的应用程序,否则可以正常工作。)
此问题是由 .require() 产生的特异性引起的。
基本上,当您提交时,params 包含 foo params,以及其余的 params。其中之一是 utf8 检查。可能还有其他的,比如当前的操作和控制器、提交按钮、CSRF 令牌等。它可能看起来像这样:
{
utf8: '✓',
controller: 'foos',
action: 'create',
foo: {
name: 'Albert',
age: '12'
}
}
当您执行 params.permit!
时,您正在请求所有参数。这将不可避免地包含您的模型中不存在的属性。
当你使用 params.require(:foo).permit!
时,你最终只需要这个位:
{
name: 'Albert',
age: '12'
}
这是您要传递给 Foo.new()
电话的内容。
在我们不关心质量分配的脚手架表单的仅限管理员的控制器中,我们仅使用许可就实现了强参数!方法(没有 .require() 或 .permit() )应该简单地将 params 允许标志设置为 true,将 params 对象中的任何内容列入白名单。
private
def foo_params
params.permit!
end
在控制器中我们有
def create
@foo = Foo.new(foo_params)
然而,在规范中和 运行 应用程序时,控制器的创建方法抛出异常:
unknown attribute 'utf8' for Foo
如果我们添加 .require(:MODEL) 错误消失,例如更改 foo_params
private
def foo_params
params.require(:foo).permit!
end
是否需要 .require() 来避免由于某些神奇添加的 Rails 表单属性(如 utf8 属性)而引发异常?
(如果它有任何不同,它是一个从 Rails 3.2 升级到 4.2 的应用程序,否则可以正常工作。)
此问题是由 .require() 产生的特异性引起的。
基本上,当您提交时,params 包含 foo params,以及其余的 params。其中之一是 utf8 检查。可能还有其他的,比如当前的操作和控制器、提交按钮、CSRF 令牌等。它可能看起来像这样:
{
utf8: '✓',
controller: 'foos',
action: 'create',
foo: {
name: 'Albert',
age: '12'
}
}
当您执行 params.permit!
时,您正在请求所有参数。这将不可避免地包含您的模型中不存在的属性。
当你使用 params.require(:foo).permit!
时,你最终只需要这个位:
{
name: 'Albert',
age: '12'
}
这是您要传递给 Foo.new()
电话的内容。