Rails强大的参数忽略命名的参数

问题描述 投票:0回答:1

在config / routes.rb中,我有以下代码

  resources :orders, param: :no do
    resources :order_items, param: :line_item do
      collection do
        get :price
      end
    end
  end

[如果我通过json发布到/orders/6061734/order_items,然后我得到以下参数:

{"line_item"=>3, "stock_no"=>265062, "order_no"=>"6061734", "order_item"=>{"line_item"=>3, "stock_no"=>265062}}

对于参数白名单我有

  def order_item_params
    params.require(:order_item).permit(:order_no, :line_item, ...)
  end

我通过json参数提交了line_itemstock_no,并通过url提交了order_noorder_item参数是由ActionController::ParamsWrapper创建的。文档状态

在没有设置:include或:exclude选项的Active Record型号上, 只会包装class方法返回的参数 attribute_names。

order_item模型上没有设置包含或排除选项,因此我对为什么order_no参数未“包装”在order_item参数中感到困惑。是因为它是url的一部分而不是json参数的一部分?我在Rails控制台中检查了OrderItem.attribute_names。返回order_no,line_item和许多其他属性。

ruby-on-rails routes strong-parameters
1个回答
1
投票

我不认为我的回答需要完整的答案,但是我没有足够的声誉点可以发表评论。

让我们看一下您的强参数实现。

params.require(:order_item).permit(:order_no, :line_item, ...)

使用#require指定您允许的每个属性都存在于:order_item子哈希中。从您发布的参数来看,:order_no似乎位于该子哈希之外。为了获得:order_no参数,可以使用以下参数。

params.permit(:order_no)
© www.soinside.com 2019 - 2024. All rights reserved.