Rails报错:unexpected =>, expecting keyword_end - Savon多商品数据问题
问题:使用Savon构建多商品XML时的语法错误
我尝试将数据传入Savon以XML格式发送,单个商品时运行正常,但用each处理多个商品时出现了如下语法错误:
syntax error, unexpected =>, expecting keyword_end 'SalesOrder' => [
可正常运行的单个商品代码
new_or = { "Order" => { "AccountCode" => '#{current_user.accode}', "Properties" => { "PropertyItem" => [ { "Name" => "Foo", "Value" => "Bar" }, { "Name" => "Colour", "Value" => "Green" } ] }, # 补上缺失的逗号,避免语法问题 "Items" => { 'SalesOrder' => { 'sku' => "SKU-100", 'Quantity' => 10, 'Price' => 10.78 } } } }
无法运行的多商品代码(存在语法错误)
new_or = { "Order" => { "AccountCode" => '#{current_user.accode}', "Properties" => { "PropertyItem" => [ { "Name" => "Foo", "Value" => "Bar" }, { "Name" => "Colour", "Value" => "Green" } ] } "Items" => { @order.items.each do |item| 'SalesOrder' => [ { 'sku' => item.sku, 'Quantity' => item.qtny, 'Price' => item.price }, ], end } } }
问题原因与解决方案
你这里的核心问题是不能直接在Hash的value位置使用each循环,each方法的返回值是原数组本身,而且这种写法完全不符合Ruby的Hash语法规则。我们需要用map方法来生成每个商品对应的Hash数组——map会遍历数组并返回处理后的新数组,正好可以作为SalesOrder对应的值。
另外还要注意Hash键值对之间的逗号(比如你原来代码里Properties块结束后缺了逗号,这也是潜在的语法问题)。
修正后的代码如下:
new_or = { "Order" => { "AccountCode" => "#{current_user.accode}", # 换成双引号才能解析变量插值 "Properties" => { "PropertyItem" => [ { "Name" => "Foo", "Value" => "Bar" }, { "Name" => "Colour", "Value" => "Green" } ] }, "Items" => { 'SalesOrder' => @order.items.map do |item| { 'sku' => item.sku, 'Quantity' => item.qtny, 'Price' => item.price } end } } }
关键修改点:
- 把
@order.items.each do |item| ... end替换成@order.items.map do |item| ... end,用map生成商品Hash数组 - 补上了
Properties块后的逗号,修复潜在语法错误 - 把
AccountCode的单引号改成双引号,这样#{current_user.accode}变量才能被正确解析(单引号里的变量不会被插值)
这样修改后,就能正确构建包含多个商品的Hash结构,传入Savon生成对应的XML了。
内容的提问来源于stack exchange,提问作者Stewart
相关产品推荐
相关产品推荐

