Rails 允许嵌套属性

Rails permit nested attribute

我正在使用 ruby-2.6.5 开发 rails 6,我正在开发 API。我正在为我的订单使用嵌套属性,如下所示:-

orders_controller.rb
# frozen_string_literal: true

module Api
  module V1
    class OrdersController < Api::V1::ApiApplicationController
      before_action :validate_token

      def create
        debugger
        order = OrderInteractor.create(order_params, @user_id)
        if order.save
          render json: { 'message' => 'Order Placed' }, status: :ok
        else
          render_errors(order)
        end
      end

      private

      def order_params
        params.require(:data)
              .require(:attributes)
              .require(:order)
              .permit(:user_id, :address_id, :total_price, :payment_status,
                      :order_number, :delivery_time_slot,
                      order_details_attributes:
                      %i[price quantity order_detail_status product_id
                         order_number variant_id],
                      payment_details_attributes:
                      %i[payment_data payment_id])
      end
    end
  end
end

Api 要求:-

{
    "data": {
        "attributes": {
            "order": {
                "address_id": "82",
                "delivery_time_slot": "5:00 PM - 8:00 PM(Today)",
                "order_details_attributes": [{
                    "price": "76.0",
                    "product_id": "46",
                    "quantity": "4",
                    "variant_id": "47"
                }, {
                    "price": "9.9",
                    "product_id": "30",
                    "quantity": "1",
                    "variant_id": "29"
                }],
                "payment_details_attributes": [{
                    "payment_data": {
                        "data": {
                            "nameValuePairs": {
                                "razorpay_payment_id": "pay_HiHceX2p6450Wa",
                                "org_logo": "",
                                "org_name": "Razorpay Software Private Ltd",
                                "checkout_logo": "https://cdn.razorpay.com/logo.png",
                                "custom_branding": false
                            }
                        },
                        "paymentId": "pay_HiHceX2p6450Wa",
                        "userContact": "+916494949494",
                        "userEmail": "dailyferia@gmail.com"
                    }
                }],
                "total_price": "354"
            }
        },
        "type": "orders"
    }
}

下订单时出现错误 Unpermitted parameter: :payment_data,但它在 order_details 上运行良好。请帮我修好吗?我也尝试了以下方法来修复它,但没有任何效果:-

payment_details_attributes: %i[:payment_data payment_id]) and `payment_details_attributes: ['payment_data', 'payment_id'])`

您的 payment_data 是一个复杂的对象,而不是在您的 order_details_attributes

中找到的标量

您需要在允许的参数中添加更多,我相信最简单的解决方案是:

payment_details_attributes: [payment_data: {}]

这应该接受 payment_details_attributes 下的所有参数,但它也将允许任何其他键。你可能想要更严格,只允许上面指定的参数,在这种情况下你可以这样做:

payment_details_attributes: [
  payment_data: {
    data: {
      nameValuePairs:
      %i[razorpay_payment_id org_logo org_name checkout_logo custom_branding]
    },
    :paymentId, :userContact, :userEmail
  }
]

这应该将参数限制为您示例中使用的格式。

其他一些注意事项:

  • 您的原始样本中有 %i[payment_data payment_id],但您的负载中没有 payment_id。示例中的属性是 paymentId,除此之外,它是 payment_data 的属性,而不是 payment_details_attributes
  • 的属性
  • 您不会使用 %i 和冒号,%i 是 shorthand 用于创建 ruby 符号数组,因此 %i[:payment_data payment_id]将创建数组 [:":payment_data", :payment_id](注意 payment_data 开头的额外冒号)

最后,我没有测试上面的代码,因此可能存在语法或其他错误,但希望这能为您指明正确的方向。