使用ror处理web服务响应

时间:2017-04-11 22:18:26

标签: ruby-on-rails ruby web-services api

我正在使用

在Rails的应用程序中收集来自Web服务的响应
response = #api.sql_data    

这会导致response等于以下内容。

response
  #=> { "success"=>true, "totalcount"=>10, "rows"=>[
  #     { "ID"=>"0001", "CODE"=>"0000001", "CODE_1"=>"Alpha",
  #       "NAME"=>"Alpha", "Balance"=>"0" },
  #     { "ID"=>"0002", "CODE"=>"0000002", "CODE_1"=>"Beta",
  #       "NAME"=>"Beta", "Balance"=>"0" },
  #     { "ID"=>"0003", "CODE"=>"0000003", "CODE_1"=>"Charlie",
  #       "NAME"=>"Charlie", "Balance"=>"0"},
  #     ...
  #     ]
  #   }

我创建了以下方法:

def format_response(response)   
  response['rows'].map do |row|
    { id: row[0],
      code: row[1],
      code1: row[2],
      balance: row[4] }   
  end.uniq { |x| x[:code1] }
end

当我为response的上述值执行此方法时,我获得以下内容。

format_response(response)
  #=> [{:id=>nil, :code=>nil, :code1=>nil, :balance=>nil}] 

这是不正确的。我希望这个表达式返回以下内容。

{"ID"=>"0001", "CODE"=>"0000001", "CODE_1"=>"Alpha", "NAME"=>"Alpha", "Balance"=>"0"}

我的错误是什么?

2 个答案:

答案 0 :(得分:3)

每一行都是一个哈希,因此您需要按名称而不是索引访问其元素(就像使用数组一样)。以下应该有效:

def format_response(response)   
  formatted_response = response['rows'].map do |row|
    { id: row['ID'],
      code: row['CODE'],
      code1: row['CODE_1'],
      balance: row['balance'] }   
  end
  formatted_response.uniq { |x| x[:code1] }
end

答案 1 :(得分:3)

response['rows']包含一系列哈希值。 ruby中的哈希值不是关联数组,因此您无法通过hash[0]获取第一个键。

def format_response(response)   
  response['rows'].map do |row|
    {   
      id: row["ID"],
      code: row["CODE"],
      code_1: row["CODE_1"],
      balance: row["BALANCE"] 
    }   
  end.uniq { |x| x[:code1] }
end