0

我有 Rails 应用程序需要从我无法控制的 SOAP 服务器检索数据。它检索附有统计信息的用户列表,并将数据作为 JSON 返回。

检索到该数据后,我需要将其与从我的 Rails 应用程序数据库中检索到的数据结合起来。

一旦我从 SOAP 服务器获得 JSON,我将它发送到 Rails 控制器,以便可以将新值添加到 JSON,然后发送回视图。

我的问题是一个非常简单的问题。一旦 JSON 在我的控制器中,我似乎无法读取和迭代它。

我认为stat_data 的 JS 是从 SOAP 服务接收到的 JSON

window.get_metrics = (stat_data) ->
    update_loading_message 'Getting Metrics'
     console.log stat_data

    $.ajax '/tracking/get_metrics',
        type: "POST"
        data: client_data: stat_data
        dataType: 'json'
        success : (data) ->
            console.log(data)
            # populate_table(data)

控制器

@client_advisors = params[:client_data]
puts @client_advisors

# This is where I would do my other processing / model calls to get new data

render file: 'tracking/metrics_data.json.erb', content_type: 'application/json'

的输出puts @client_advisors

{
"0"=>
{
"personnel_id"=>"1495", 
"personnel_name"=>"John Smith",
"statistic_x"=>"200"
}, 
"1"=>
{
"personnel_id"=>"5266",
"personnel_name"=>"John Candy",
"statistic_x"=>"300"
},
"2"=>{
... etc ...
}
}

跟踪/metrics_data.json.erb

[
<%= puts '~~~~~~~~~~~~  PROCESSING JSON' %>
<% @client_advisors.each do |advisor| %>

<%= puts 'advisor::' %>
<%= puts advisor %>
<%= puts 'advisor.inspect::' %>
<%= puts advisor.inspect %>
{   
... This is where my re-generated JSON would go

}
<% end %> 
]

可笑的是,我似乎无法在我的 metrics_data.json.erb 中定位personal_name 或personal_id。它在控制台中输出每个完整的顾问对象都很好......但我不确定我应该使用什么来定位对象的值。我试过advisor.personnel_name(显然不会工作,因为对象被命名为“0、1、2等” )advisor['0'],,,advisor[0]advisor[:0]没有一个允许我更深入地检索personal_name。

非常感谢您的时间!

解决了!

感谢@willglynn

“jQuery - 有点令人惊讶 - 没有创建 JSON 的机制。它可以很好地解析,但你必须自己对其进行编码。你可以使用 JSON.stringify ,但是对于某些浏览器,你需要 JSON2.js” - @willglynn

更新了 JS

window.get_metrics = (stat_data) ->
    update_loading_message 'Getting Metrics'
     console.log stat_data

    $.ajax '/tracking/get_metrics',
        type: "POST"
        data: client_data: JSON.stringify(stat_data)
        dataType: 'json'
        success : (data) ->
            console.log(data)
            # populate_table(data)

更新的控制器

@client_advisors = JSON.parse(params[:client_data])

更新了 tracking/metrics.erb.json

<% puts advisor %>
<% puts advisor['personnel_id'] %>
4

2 回答 2

3

为了回答您的问题,当 Rails 获取POSTJSON 内容时,它会将请求内容转换为类似于表单提交的内容。这意味着它params[]不会与原始对象完全匹配。要取回原始对象,您需要在 Rails 背后直接从请求中解析出来:

@client_advisors = ActiveSupport::JSON.decode(request.body.read)

也就是说,我会对此代码进行一些更改。

  • 你有一个返回 JSON 的 SOAP 服务器,它以某种方式被发送到你的 Rails 应用程序。这是什么组件?为什么?你能去掉中间人,让 Rails 直接与 SOAP 组件对话吗?
  • erb您正在模板中生成带有字符串连接的 JSON 。这是容易出错且乏味的。相反,使用render :json => [{ 'key' => 'value' }].
  • 您正在将大量知识放入视图中。这是一个正常的起点,但并不理想。我可能会创建一个模型来封装来自这个 SOAP 组件的响应——不是 ActiveRecord,只是一个 Ruby 对象——并让该模型负责与我的其他模型交互以获得所需的效果。

最后一个很重要,因为它可以让您消除视图并将控制器简化为:

@soap_thing = CrazySoapThing.parse(request.body.read)
@soap_thing.sync
render :json => @soap_thing.affected_records

有关更多信息,请参阅瘦控制器、胖模型

于 2012-10-12T14:16:10.593 回答
1

@client_advisors只是一个字符串,你必须先解析它:

@client_advisors = JSON.parse(params[:client_data])
@client_advisors['0']['personnel_name'] #=>"John Smith"

您还应该看看RABL ( Railscast )。


顺便说一句:<%= puts foo %>这不是一个好习惯,因为<%=它是针对指定输出的。如果您必须打印调试数据,请使用<% logger.debug { foo.inspect } %>或使用适当的调试器 ( gem 'debugger')

于 2012-10-12T14:02:09.953 回答