Savon 对我的 Ruby 代码的解释错误
Wrong Savon interpretation of my Ruby code
我对我的代码有错误的解释,或者我不明白
让它工作。
基本上我收到了这个请求:
def create_request
return {} unless !@person.nil?
req = {
ProfileIDVersion: {
ID: ENV['GBGROUP_PROFILE_ID'],
Version: ENV['GBGROUP_PROFILE_VERSION']
},
CustomerReference: reference,
InputData: {
Personal: {
PersonalDetails: {
Title: @person.title,
Forename: @person.first_name,
MiddleName: @person.middle_name,
Surname: @person.last_name,
Gender: @person.gender,
DOBDay: @person.dob.nil? ? '' : @person.dob.day,
DOBMonth: @person.dob.nil? ? '' : @person.dob.month,
DOBYear: @person.dob.nil? ? '' : @person.dob.year
}
},
Addresses: []
}
}
address_count = 0
@person.addresses.each do |address|
Rails.logger.debug 'Adding address'
if address_count == 0
Rails.logger.debug 'Adding current address'
req[:InputData][:Addresses] << {
CurrentAddress: {
Country: address.country,
ZipPostcode: address.postcode,
AddressLine1: address.line1,
AddressLine2: address.line2,
AddressLine3: address.town_city,
FirstYearOfResidence: address.from_year,
LastYearOfResidence: address.to_year
}
}
else
Rails.logger.debug 'Adding previous address'
req[:InputData][:Addresses] << {
"PreviousAddress#{address_count}" => {
Country: address.country,
ZipPostcode: address.postcode,
AddressLine1: address.line1,
AddressLine2: address.line2,
AddressLine3: address.town_city,
FirstYearOfResidence: address.from_year,
LastYearOfResidence: address.to_year
}
}
end
address_count += 1
end
end
我期望输出的位置:
<ns:Addresses>
<ns:CurrentAddress>
<ns:Country>United Kingdom</ns:Country>
<ns:ZipPostcode>SP9 7EW</ns:ZipPostcode>
<ns:AddressLine1>3 Bayeux Mews</ns:AddressLine1>
<ns:AddressLine2>St Georges Road</ns:AddressLine2>
<ns:AddressLine3>Tidworth</ns:AddressLine3>
<ns:FirstYearOfResidence>2015</ns:FirstYearOfResidence>
<ns:LastYearOfResidence>2015</ns:LastYearOfResidence>
</ns:CurrentAddress>
<ns:PreviousAddress1>
<ns:Country>United Kingdom</ns:Country>
<ns:ZipPostcode>SP9 7EW</ns:ZipPostcode>
<ns:AddressLine1>3 Bayeux Mews</ns:AddressLine1>
<ns:AddressLine2>St Georges Road</ns:AddressLine2>
<ns:AddressLine3>Tidworth</ns:AddressLine3>
<ns:FirstYearOfResidence>2012</ns:FirstYearOfResidence>
<ns:LastYearOfResidence>2015</ns:LastYearOfResidence>
</ns:PreviousAddress1>
</ns:Addresses>
相反,我得到了:
<ns:Addresses>
<ns:CurrentAddress>
<ns:Country>United Kingdom</ns:Country>
<ns:ZipPostcode>SP9 7EW</ns:ZipPostcode>
<ns:AddressLine1>3 Bayeux Mews</ns:AddressLine1>
<ns:AddressLine2>St Georges Road</ns:AddressLine2>
<ns:AddressLine3>Tidworth</ns:AddressLine3>
<ns:FirstYearOfResidence>2015</ns:FirstYearOfResidence>
<ns:LastYearOfResidence>2015</ns:LastYearOfResidence>
</ns:CurrentAddress>
</ns:Addresses>
<ns:Addresses>
<ns:PreviousAddress1>
<ns:Country>United Kingdom</ns:Country>
<ns:ZipPostcode>SP9 7EW</ns:ZipPostcode>
<ns:AddressLine1>3 Bayeux Mews</ns:AddressLine1>
<ns:AddressLine2>St Georges Road</ns:AddressLine2>
<ns:AddressLine3>Tidworth</ns:AddressLine3>
<ns:FirstYearOfResidence>2012</ns:FirstYearOfResidence>
<ns:LastYearOfResidence>2015</ns:LastYearOfResidence>
</ns:PreviousAddress1>
</ns:Addresses>
如您所见,我有两个地址块,一个包含当前地址,另一个包含
以前的地址,但只需要一个地址块。
猜测问题可能是多次调用:
req[:InputData][:Addresses] <<
但我实际上不知道如何解决才能将所有地址都放在一个块中。
这是我从规范测试中得到的:
"Addresses": [
{
"CurrentAddress": {
"Country": "United Kingdom",
"ZipPostcode": "OX4 2QX",
"AddressLine1": "36 Brasenose Driftway",
"AddressLine2": "Oxford",
"AddressLine3": null,
"FirstYearOfResidence": 2002,
"LastYearOfResidence": 2014
}
},
{
"PreviousAddress1": {
"Country": "United Kingdom",
"ZipPostcode": "AB1 1AA",
"AddressLine1": "21 A Street",
"AddressLine2": "Aberdeen",
"AddressLine3": null,
"FirstYearOfResidence": 1998,
"LastYearOfResidence": 2002
}
}
]
感谢任何人都会花一分钟回复,
卡特彼勒
在 ruby 哈希和 xml 之间进行转换的 savon 位是一个名为 gyoku 的 gem。对于 gyoku,一个数组值会产生多个元素(其名称由键给出)。如果您不希望这样,那么 Addresses 键的值必须是一个散列,即您的输入应该看起来像
{"Addresses" => {
"CurrentAddress" => {
"Country" => "United Kingdom",
...
},
"Previous" => {
"Country" => "United Kingdom",
...
}
}
我对我的代码有错误的解释,或者我不明白 让它工作。
基本上我收到了这个请求:
def create_request
return {} unless !@person.nil?
req = {
ProfileIDVersion: {
ID: ENV['GBGROUP_PROFILE_ID'],
Version: ENV['GBGROUP_PROFILE_VERSION']
},
CustomerReference: reference,
InputData: {
Personal: {
PersonalDetails: {
Title: @person.title,
Forename: @person.first_name,
MiddleName: @person.middle_name,
Surname: @person.last_name,
Gender: @person.gender,
DOBDay: @person.dob.nil? ? '' : @person.dob.day,
DOBMonth: @person.dob.nil? ? '' : @person.dob.month,
DOBYear: @person.dob.nil? ? '' : @person.dob.year
}
},
Addresses: []
}
}
address_count = 0
@person.addresses.each do |address|
Rails.logger.debug 'Adding address'
if address_count == 0
Rails.logger.debug 'Adding current address'
req[:InputData][:Addresses] << {
CurrentAddress: {
Country: address.country,
ZipPostcode: address.postcode,
AddressLine1: address.line1,
AddressLine2: address.line2,
AddressLine3: address.town_city,
FirstYearOfResidence: address.from_year,
LastYearOfResidence: address.to_year
}
}
else
Rails.logger.debug 'Adding previous address'
req[:InputData][:Addresses] << {
"PreviousAddress#{address_count}" => {
Country: address.country,
ZipPostcode: address.postcode,
AddressLine1: address.line1,
AddressLine2: address.line2,
AddressLine3: address.town_city,
FirstYearOfResidence: address.from_year,
LastYearOfResidence: address.to_year
}
}
end
address_count += 1
end
end
我期望输出的位置:
<ns:Addresses>
<ns:CurrentAddress>
<ns:Country>United Kingdom</ns:Country>
<ns:ZipPostcode>SP9 7EW</ns:ZipPostcode>
<ns:AddressLine1>3 Bayeux Mews</ns:AddressLine1>
<ns:AddressLine2>St Georges Road</ns:AddressLine2>
<ns:AddressLine3>Tidworth</ns:AddressLine3>
<ns:FirstYearOfResidence>2015</ns:FirstYearOfResidence>
<ns:LastYearOfResidence>2015</ns:LastYearOfResidence>
</ns:CurrentAddress>
<ns:PreviousAddress1>
<ns:Country>United Kingdom</ns:Country>
<ns:ZipPostcode>SP9 7EW</ns:ZipPostcode>
<ns:AddressLine1>3 Bayeux Mews</ns:AddressLine1>
<ns:AddressLine2>St Georges Road</ns:AddressLine2>
<ns:AddressLine3>Tidworth</ns:AddressLine3>
<ns:FirstYearOfResidence>2012</ns:FirstYearOfResidence>
<ns:LastYearOfResidence>2015</ns:LastYearOfResidence>
</ns:PreviousAddress1>
</ns:Addresses>
相反,我得到了:
<ns:Addresses>
<ns:CurrentAddress>
<ns:Country>United Kingdom</ns:Country>
<ns:ZipPostcode>SP9 7EW</ns:ZipPostcode>
<ns:AddressLine1>3 Bayeux Mews</ns:AddressLine1>
<ns:AddressLine2>St Georges Road</ns:AddressLine2>
<ns:AddressLine3>Tidworth</ns:AddressLine3>
<ns:FirstYearOfResidence>2015</ns:FirstYearOfResidence>
<ns:LastYearOfResidence>2015</ns:LastYearOfResidence>
</ns:CurrentAddress>
</ns:Addresses>
<ns:Addresses>
<ns:PreviousAddress1>
<ns:Country>United Kingdom</ns:Country>
<ns:ZipPostcode>SP9 7EW</ns:ZipPostcode>
<ns:AddressLine1>3 Bayeux Mews</ns:AddressLine1>
<ns:AddressLine2>St Georges Road</ns:AddressLine2>
<ns:AddressLine3>Tidworth</ns:AddressLine3>
<ns:FirstYearOfResidence>2012</ns:FirstYearOfResidence>
<ns:LastYearOfResidence>2015</ns:LastYearOfResidence>
</ns:PreviousAddress1>
</ns:Addresses>
如您所见,我有两个地址块,一个包含当前地址,另一个包含 以前的地址,但只需要一个地址块。
猜测问题可能是多次调用:
req[:InputData][:Addresses] <<
但我实际上不知道如何解决才能将所有地址都放在一个块中。
这是我从规范测试中得到的:
"Addresses": [
{
"CurrentAddress": {
"Country": "United Kingdom",
"ZipPostcode": "OX4 2QX",
"AddressLine1": "36 Brasenose Driftway",
"AddressLine2": "Oxford",
"AddressLine3": null,
"FirstYearOfResidence": 2002,
"LastYearOfResidence": 2014
}
},
{
"PreviousAddress1": {
"Country": "United Kingdom",
"ZipPostcode": "AB1 1AA",
"AddressLine1": "21 A Street",
"AddressLine2": "Aberdeen",
"AddressLine3": null,
"FirstYearOfResidence": 1998,
"LastYearOfResidence": 2002
}
}
]
感谢任何人都会花一分钟回复, 卡特彼勒
在 ruby 哈希和 xml 之间进行转换的 savon 位是一个名为 gyoku 的 gem。对于 gyoku,一个数组值会产生多个元素(其名称由键给出)。如果您不希望这样,那么 Addresses 键的值必须是一个散列,即您的输入应该看起来像
{"Addresses" => {
"CurrentAddress" => {
"Country" => "United Kingdom",
...
},
"Previous" => {
"Country" => "United Kingdom",
...
}
}