【问题标题】:Rails Strong Parameters - Not passing through array parameter even when permitted as correct typeRails 强参数 - 即使允许为正确类型,也不会通过数组参数
【发布时间】:2018-03-27 10:11:20
【问题描述】:

使用 Ruby on Rails (5.1.4),我尝试将 ID 数组传递给控制器​​,同时可以选择将数组嵌套在带有控制器名称的散列中。我的params方法如下:

  def operator_params
    params.fetch(:operator, {}).permit(ids: [])
  end

附加到请求的示例 JSON 正文可能是(尽管我也尝试将数组放入 URL):

{
    "ids": ["asd"]
}

Rails 看到参数:Parameters: {"ids"=>["asd"], "id"=>"570158bb-428d-4e55-b55a-a94d1515c24a", "operator"=>{}},但仍将它们过滤掉。

ap operator_params 的结果是{}

我是否遗漏了一些明显的东西?

奇怪的是,我在我的应用程序的其他地方使用了类似的逻辑:params.fetch(:flight, {}).permit(..., :ids),它甚至没有按照通常的要求声明数组类型,但工作正常。


更新:我对 .fetch 的理解似乎有点偏离,应该是:

def operator_params
  params.fetch(:operator, params).permit(ids: [])
end

应该允许您提交{"operator": {"ids": []}}{"ids": []} 并接受其中一个。但是,这似乎仍然不适用于数组。此方法将接受前者(嵌套在operator 下),而:

def operator_params
  params.permit(ids: [])
end

如您所料,将接受后者(没有嵌套)。根据the rails API doc 上的描述,如果缺少operator 键,包括第二个参数(即params)将使用该值,因此它应该工作。

【问题讨论】:

    标签: ruby-on-rails strong-parameters


    【解决方案1】:

    参数:{"ids"=>["asd"], "id"=>"570158bb-428d-4e55-b55a-a94d1515c24a", "operator"=>{}}

    改成

    参数:{"ids"=>["asd", "{"id" => "570158bb-428d-4e55-b55a-a94d1515c24a"}", "{"operator"=>{}}"]}

    【讨论】:

      【解决方案2】:

      这是由于您的参数包含 operator 的空哈希

      将参数值传递为

      { "operator"=> { "ids"=>["asd"], "id"=>"570158bb-428d-4e55-b55a-a94d1515c24a" } }
      

      【讨论】:

      • 我的理解是 fetch() 方法将允许参数嵌套在运算符下或不允许。如果可能的话,我想维护它,因为控制器中的其他方法会使用它
      • 在这种情况下,您需要在 operator 键中传递 idsid 并从参数中获取运算符
      猜你喜欢
      • 2017-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-25
      相关资源
      最近更新 更多