了解Rails Params + Graphql突变交互



我有两个rails应用程序,一个是graphql API,另一个是REST API应用程序以及。让我们将图形应用程序称为graphi,将REST应用程序称为resti

  1. graphi向resti发送数据

  2. resti然后与外部API对话,从外部API获得响应,并与graphi对话并提供良好的响应。

好的,那么graphi有一个突变叫做vendor。可以像这样:

mutation {
createVendor(
input: {
vendorId: 2,
quoteType: "renter",
renterData: {
firstName: "Tony",
lastName: "Stark",
email: "tony@starkindustries",
phoneType: "mobile",
phone: "6504881234",
requestType: "renter",
address1: "123 Main Street",
addressCity: "Palo Alto",
addressState: "CA",
addressZip: "94301",
dob: "1990-07-22"
}
}
) 
}

然后我在create_vendor.rb (mutation file)上像这样通过httparty发送这个数据:

class CreateVendor < Mutations::BaseMutation
description 'Create a vendor'
argument :vendor_id, ID, required: false
argument :quote_type, String, required: true
argument :renter_data, Types::RenterVendorType, required: false
field :vendor, Types::VendorType, null: false

def resolve(args)
response = HTTParty.post(
'http://localhost:3001/api/v2/vendor', <-- this sends data to resti
body: JSON.parse(args.to_json),
headers: AUTHORIZATION_HEADERS
)
if response.success?
puts "Cool, I was successfull"
else
puts "I wasn't successful"
end
end
end

一旦graphi发送数据到resti, resti服务器看起来像这样:

Processing by Api::V2::VendorController#create as */*
Parameters: {"vendor_id"=>"2", "quote_type"=>"renter", "renter_data"=>{"first_name"=>"Tony", "last_name"=>"Stark", "email"=>"tony@starkindustries", "phone_type"=>"mobile", "phone"=>"6504881234", "request_type"=>"renter", "address1"=>"123 Main Street", "address_city"=>"Palo Alto", "address_state"=>"CA", "address_zip"=>"94301", "dob"=>"1990-07-22"}}

现在,这不再是图形化的东西了,它传递给一个带有一个嵌套参数的哈希。

在resti的控制器上,我有类似于permit vendor params的东西

def create_vendor_params
params.require(:vendor).permit(
:vendor_id, :quote_type, renter_data: %i[first_name last_name email phone_type phone request_type address1 address_city address_state address_zip DOB]
)
end

当我执行这个流程时,我在resti服务器上收到了这个问题:

ActionController::ParameterMissing (param is missing or the value is empty: vendor
Did you mean?  vendor_id
renter_data
action
quote_type):

当我在Postman上测试同样的东西时使用这个数据结构:

{   "vendor": {
"vendor_id": 2,
"quote_type": "renter",
"renter_data": {
"first_name":"Tony",
"last_name":"Stark",
"email":"tony@starkindustries.com",
"phone_type":"mobile",
"phone":"6504881234",
"request_type":"renter",
"address1":"123 Main Street",
"address_city":"Palo Alto",
"address_state":"CA",
"address_zip":"94301",
"DOB":"1990-07-22"
}
}
}

我收到以下内容:

#<ActionController::Parameters {"vendor"=>#<ActionController::Parameters (#<ActionController::Parameters this  piece of code is ruining everything,) {"_id"=>2, "quote_type"=>"renter", "renter_data"=>{"first_name"=>"Tony", "last_name"=>"Stark", "email"=>"tony@starkindustries.com", "phone_type"=>"mobile", "phone"=>"6504881234", "request_type"=>"renter", "address1"=>"123 Main Street", "address_city"=>"Palo Alto", "address_state"=>"CA", "address_zip"=>"94301", "DOB"=>"1990-07-22"}} permitted: false>, "controller"=>"api/v2/vendor", "action"=>"create"} permitted: false>

我不明白为什么会这样。当我对这段代码执行byebug时:

def create_vendor_params
params.require(:vendor).permit(
:vendor_id, :quote_type, renter_data: %i[first_name last_name email phone_type phone request_type address1 address_city address_state address_zip DOB]
)
byebug
end

我手动做这个:

(byebug) params.require(:vendor).permit(
:vendor_id, :quote_type, renter_data: %i[first_name last_name email phone_type phone request_type address1 address_city address_state address_zip DOB]
)

它打印出如下内容:

#<ActionController::Parameters {"vendor_id"=>2, "quote_type"=>"renter", "renter_data"=>#<ActionController::Parameters {"first_name"=>"Tony", "last_name"=>"Stark", "email"=>"tony@starkindustries.com", "phone_type"=>"mobile", "phone"=>"6504881234", "request_type"=>"renter", "address1"=>"123 Main Street", "address_city"=>"Palo Alto", "address_state"=>"CA", "address_zip"=>"94301", "DOB"=>"1990-07-22"} permitted: true>} permitted: true>

这是允许的!!

为什么会发生这种情况?graphql是如何构建数据的?我将非常感谢你的帮助!

您发送给resti的参数形状不正确。如果你仔细观察,这些参数并没有嵌套在vendor下面,就像你通过Postman发送它们时那样。

您的突变应该具有以下结构变异

createVendor(
input: {
vendor: {
vendorId: 2,
quoteType: "renter",
renterData: {
firstName: "Tony",
lastName: "Stark",
email: "tony@starkindustries",
phoneType: "mobile",
phone: "6504881234",
requestType: "renter",
address1: "123 Main Street",
addressCity: "Palo Alto",
addressState: "CA",
addressZip: "94301",
dob: "1990-07-22"
}
}
}
)

最新更新