【问题标题】:Rails 4.2.4 params.permit! fails to ignore utf field in formRails 4.2.4 params.permit!未能忽略表单中的 utf 字段
【发布时间】:2015-11-30 04:41:33
【问题描述】:

在我们不关心批量分配的脚手架表单的管理员专用控制器中,我们仅使用许可实现了强参数!方法(没有 .require() 或 .permit() )应该简单地将 params 允许标志设置为 true,将 params 对象中的任何内容列入白名单。

private
    def foo_params
      params.permit!
    end

在我们的控制器中

def create
  @foo = Foo.new(foo_params)

但是,在规范和运行应用程序时,控制器的 create 方法会抛出异常:

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 的应用程序,否则可以正常工作。)

【问题讨论】:

    标签: ruby-on-rails forms strong-parameters


    【解决方案1】:

    这个问题是由 .require() 产生的特殊性引起的。

    基本上,当您提交时,参数包含 foo 参数以及其余参数。其中之一是 utf8 检查。可能还有其他的,比如当前的操作和控制器、提交按钮、CSRF 令牌等。它可能看起来像这样:

    {
      utf8: '✓',
      controller: 'foos',
      action: 'create',
      foo: {
        name: 'Albert',
        age: '12' 
      }
    }
    

    当您执行params.permit! 时,您正在请求所有参数。这将不可避免地包含模型上不存在的属性。

    当您使用params.require(:foo).permit! 时,您最终只使用了这一点:

    {
      name: 'Albert',
      age: '12' 
    }
    

    这是您要传递给您的 Foo.new() 呼叫的内容。

    【讨论】:

    • 或者,也可以使用@foo = Foo.new(foo_params[:foo]),但这有点笨拙...
    猜你喜欢
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多