0

私の制御外にある SOAP サーバーからデータを取得する必要がある Rails アプリケーションがあります。統計が添付されたユーザーのリストを取得し、データを JSON として返します。

そのデータを取得したら、Rails アプリ データベースから取得したデータと結合する必要があります。

SOAP サーバーから JSON を取得したら、それを Rails コントローラーに送信して、JSON に新しい値を追加し、ビューに送り返すことができるようにします。

私の問題は非常に単純なものです。コントローラーに入ると、JSON を読み取って反復処理できないようです。

私のビューからの JS stat_data は、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 で person_name または person_id をターゲットにできないようです。コンソールで各完全なアドバイザーオブジェクトを正常に出力しています...しかし、オブジェクトの値をターゲットにするために何を使用すればよいかわかりません。私は試しましたadvisor.personnel_name(オブジェクトの名前が「0、1、2など」であるため、明らかに機能しません)advisor['0']、、、。より深いレベルに進み、personal_name を取得できるものはありません。advisor[0]advisor[:0]

あなたの時間を大歓迎です!

解決しました!

@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

詳細については、Skinny Controller、Fat Modelを参照してください。

于 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 に答える