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() 电话的内容。