2012-05-03 11 views
1

私はORMとしてDatamapperを使用してRails 3アプリケーションを作成しています。私は検索のためにElasticSearchを使用していますが、ActiveRecordに依存するように見えるので、タイヤの宝石を使用することはできません。RestClientの弾性サーチ応答を解析する

私はRestClientを使用してElasticSearchにリクエストを送信していますが、ルビーでレスポンスを解析する際に問題があります。

私はGETリクエスト "http://localhost:9200/twitter/tweet/2" を提出した場合、私はブラウザに次を得る:Railsでは

{ 
    "_index": "twitter", 
    "_type": "tweet", 
    "_id": "2", 
    "_version": 3, 
    "exists": true, 
    "_source": { 
    "user": "kimchy", 
    "post_date": "2009-11-15T14:12:12", 
    "message": "kimchy kimchy says" 
    } 
} 

、私は次のように入力するとき:

response = RestClient.get 'http://localhost:9200/twitter/tweet/2',{:content_type => :json, :accept => :json} 

を、私はこの結果を得ます:

{ 
    "_index": "twitter", 
    "_type": "tweet", 
    "_id": "2", 
    "_version": 3, 
    "exists": true, 
    "_source": { 
    "user": "kimchy", 
    "post_date": "2009-11-15T14:12:12", 
    "message": "kimchy kimchy says" 
    } 
} 

これはみかん正しい見えますが、私は私ノルムのようなドット表記を使用してデータを取得することはできません同盟者はJSONを使用します。

たとえば、定義されていないメソッドエラーが発生するため、response._typeを書き込むことはできません。

本当にありがとうございます。

+0

タイヤはActiveRecordに依存しませんが、ActiveModelに依存します。 DataMapperがActiveModelと互換性のあるインタフェースを提供する場合は、ソートする必要があります。 – karmi

答えて

2

手動変換を実行する場合は、jsonからの応答を解析し、それを手動でオブジェクトに変換して、ドット表記のフィールドにアクセスできます。このような

何か:

require 'json' 
require 'ostruct' 

response = RestClient.get '...url...' 
o = OpenStruct.new(JSON.parse(response)) 

次にあなたがo._typeo.messageでフィールドにアクセスすることができるはずです。

0

あなたが探しているものよりもおそらくより広範な答えは...

私はElasticSearchに私RestClient呼び出しをラップするthis gistのようなものを使用。これはJSON出力を解析し、RestushClientの例外の一部を救済し、サーバー出力を解析してクライアントコードに渡します。ここで

はあなたのための要約版です:

# url and method are provided as a param 
options = { url: '...', method: '...' } 

# default options 
options = { 
    headers: { 
    accept:  :json, 
    content_type: :json 
    }, 
    open_timeout: 1, 
    timeout:  1 
} 

begin 
    request = RestClient::Request.new(options) 
    response = request.execute 
    JSON.parse(response.to_str) 

rescue RestClient::BadRequest => e # and others... 
    # log e.message 
    JSON.parse(e.response.to_str) 
end 

は最後に、あなたはElasticSearchのJSON応答から解析されたハッシュを取得します。

DataMapperとのやりとりは、私の通常の経験の範囲外ですが、コメントで明確にしたり質問したりできます。