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 开头的额外冒号)
最后,我没有测试上面的代码,因此可能存在语法或其他错误,但希望这能为您指明正确的方向。
我正在使用 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 开头的额外冒号)
最后,我没有测试上面的代码,因此可能存在语法或其他错误,但希望这能为您指明正确的方向。