6

Rails 3.2アプリケーションのモデルとしてJSONサービスを使用するにはどうすればよいですか?

モデルメソッドをJSONリクエストにリンクしたいのですが、例:

  • MyModel.create新しいレコードを作成するためのJSONリクエストを生成します
  • MyModel.findJSONリクエストを生成してレコードを取得し、JSONレスポンスをモデルオブジェクトにデコードします

このタイプの機能を構築するための好ましい方法は何ですか?私が検討しているオプションの1つは、カスタムDataMapperアダプターを作成することです。

ありがとう。

更新:
ActiveResourceを使用できないことに注意してください。これは、JSONサービスが特定の方法で応答する必要があるためですが、この場合はそうではありません。

4

5 に答える 5

3

簡単な答え:それはあなたのJSONサービスに依存します。

初心者にとって、サービスはRESTfulですか?もしそうなら、あなたは運がいいです。ActiveResourceは機能createていないため、使用することはお勧めしませんが、コード自体は、APIにアクセスし、ActiveRecordがDB内のレコードを作成およびfindクエリする方法でレコードを操作するためのラッパーメソッドのセットを作成するための良い出発点を提供します。レールはRESTful-nessを中心に構築されているため、APIがRESTfulの場合、これは比較的簡単です。そのため、2つの間のマッピングははるかにクリーンになります。

この記事はそれをうまくまとめています:

Railsを使用すると、RESTの原則に従い、Webブラウザーやプログラム可能なWebと同等に機能するWebサービスを非常に簡単に構築できます。実際、その単純さの多くは、これらの原則に従うことから直接もたらされます。リソースを作成、読み取り、更新、または削除する方法をクライアントに指示する必要はありませんでした。これらはすべて、適切なHTTPメソッドを使用して実行されました。私たちがしなければならなかったのは、クライアントを適切な場所に向けることです。

あなたのサービスがRESTfulでない場合、それはおそらくそうであると私が思う他の質問へのコメントから判断すると、あなたはあなたのためにあなたの仕事を切り取ってもらうでしょう。ActiveModelはこの作業を行いません:ActiveRecord :: Persistencecreate定義され、 ActiveRecord::FinderMethodsで定義されます。それらはActiveModelにはありません。ActiveResourceは、インターフェースしているサービスのタイプ(つまり、RESTfulであるということ、およびその他のいくつかのこと)について想定しているため、それらをかなり簡単に再現できます。find

ActiveModelが提供するのは、レールをモデルの処理に非常に役立つものにする他のすべてのものです。検証システム、シリアル化メソッド、属性変更のダーティトラッキング、コールバック(before_saveafter_saveなど)、変換/ローカリゼーションなどです。これらはすべて非常に便利な関数ですが、それでもAPI呼び出しをラップするという問題が残ります。

限られた経験ではありますが、これが私がお勧めするものです(それについての私の最後のメモを参照してください):

  1. まず、APIを詳しく調べて、RESTfulにどれだけ近いかを把握します。RESTfulでない場合は、RESTfulサービスのように扱うことができるように、これを回避する方法を検討する必要があります。これを行う方法の良い参考資料は、O'ReillyのRESTful Webサービス(具体的には、第2章「Webサービスクライアントの作成」)です。
  2. createfindおよびその他のActiveRecordのような機能を実装するAPIラッパーを作成します。Net :: HTTPを直接操作するのではなく、実際にAPIにリクエストを送信するために、FaradayHTTPartyなどのgemを使用することをお勧めし ます。(私はDataMapperを使用したことがないので、コメントすることはできません。)
  3. ラッパークラスをRailsモデルのようにするために使用するActiveModelの要素(検証、シリアル化など)をすべて含めます。Rails4では、新しいベアボーンActiveModel::Modelを使用してすべてを実際に含めることができます。

これにより、JSONサービスをRailsモデルとして使用する方法の多くが得られます。

ちなみに、この種のことを実際に実装した私の経験は、XML APIにアクセスするための(作業中の)APIラッパーの構築に限定されています。ラッパーには、APIへのクエリを検証するためのActiveModelバリデーターを含むクラスがあります。ActiveModelバリデーターは、APIが正しくアクセスされることを保証するのに非常に便利ですが、ラッパーはAPIからレコードを取得するためだけのものであり、実際にレコードを作成または更新するためのものではないため、インターフェイスは予想よりもはるかに簡単です。構築します。

于 2012-08-13T21:22:07.943 に答える
1

あなたが探しているのは だと思います.RESTful JSON APIを操作ActiveResourceする代わりにそれを使うことができます.ActiveRecord

于 2012-08-03T05:28:38.593 に答える
1

これを行う最善の方法は、ActiveModel を実装することです。このRailscastは基本をカバーしています。

于 2012-08-11T09:08:30.660 に答える
0

Web サービスが通常の「Rails のやり方」から外れている場合は、HTTPartyをお勧めします。応答する Web サービスへのプロキシを作成するのは非常に簡単です。

たとえば、これは Twitter のタイムラインにアクセスする例です。

class Twitter
  include HTTParty
  base_uri 'twitter.com'

  def initialize(u, p)
    @auth = {:username => u, :password => p}
  end

  # which can be :friends, :user or :public
  # options[:query] can be things like since, since_id, count, etc.
  def timeline(which=:friends, options={})
    options.merge!({:basic_auth => @auth})
    self.class.get("/statuses/#{which}_timeline.json", options)
  end

  def post(text)
    options = { :query => {:status => text}, :basic_auth => @auth }
    self.class.post('/statuses/update.json', options)
  end
end

twitter = Twitter.new(config['email'], config['password'])
pp twitter.timeline
于 2012-08-14T18:55:56.707 に答える
0

私は自分の宝石「otrs_connector」でこれを行います...それはあなたのサービスでは機能しませんが、それを行う方法についてのアイデアを与えることができます...私が取ったアプローチは最善ではないかもしれませんし、リファクタリングする必要があります少しですが、うまく機能します。

于 2012-08-02T23:50:07.763 に答える