You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 
    } 
  } 
}

关键修改点:

  1. 把@order.items.each do |item| ... end替换成@order.items.map do |item| ... end,用map生成商品Hash数组
  2. 补上了Properties块后的逗号,修复潜在语法错误
  3. 把AccountCode的单引号改成双引号,这样#{current_user.accode}变量才能被正确解析(单引号里的变量不会被插值)

这样修改后,就能正确构建包含多个商品的Hash结构,传入Savon生成对应的XML了。

内容的提问来源于stack exchange,提问作者Stewart

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:14:05