16

私は使用してrespond_withおり、データを正しく取得するためにすべてが正しく接続されています。json返された,xmlおよびフォーマットを DRYにカスタマイズしたいのですが、限られたandfoobarを使用してそれを行う方法がわかりません。これらは、データが単純な場合には優れていますが、検索結果が複雑な場合は、私が望むものには達しません。:only:include

has_many画像の投稿があるとしましょう

def show
  @post = Post.find params[:id]
  respond_with(@post)
end

私はこれを行うことができるように、応答に画像を含めたい:

def show
  @post = Post.find params[:id]
  respond_with(@post, :include => :images)
end

しかし、画像オブジェクト全体を送信したくはありません。URLだけです。これに加えて、次のようなこともできるようになりたいです (疑似コード):

def show
  @post = Post.find params[:id]
  respond_with(@post, :include => { :foo => @posts.each.really_cool_method } )
end

def index
  @post = Post.find params[:id]
  respond_with(@post, :include => { :foo => @post.really_cool_method } )
end

…しかし、すべてドライな方法で。古い Rails プロジェクトでは、XML ビルダーを使用して出力をカスタマイズしましたが、json、xml、html で複製するのは正しくないようです。Railsの達人がRails 3に何かを入れたのを想像する必要がありますが、この種の動作については私は気づいていません。アイデア?

4

3 に答える 3

21

as_jsonモデルでオーバーライドできます。何かのようなもの:

class Post < ActiveRecord::Base
  def as_json(options = {})
    {
      attribute: self.attribute, # and so on for all you want to include
      images:    self.images,    # then do the same `as_json` method for Image
      foo:       self.really_cool_method
    }
  end
end

そして、Rails は を使用するときに残りの処理を行いrespond_withます。何optionsに設定されるかは完全にはわかりませんが、おそらくあなたが与えるオプションrespond_with(:includeなど:only)

于 2011-01-26T11:18:12.887 に答える
8

遅すぎるかもしれませんが、Rails ドキュメントを掘り下げて、より DRY なソリューションを見つけました。これは私の簡単なテストでは機能しますが、微調整が必​​要になる場合があります。

# This method overrides the default by forcing an :only option to be limited to entries in our
# PUBLIC_FIELDS list
def serializable_hash(options = nil)
  options ||= {}
  options[:only] ||= []
  options[:only] += PUBLIC_FIELDS
  options[:only].uniq!
  super(options)
end

これにより、基本的に、パブリック API で許可されているフィールドのリストを持つことができ、オブジェクト全体を誤って公開することはありません。特定のフィールドを手動で公開することもできますが、デフォルトでは、オブジェクトは .to_json、.to_xml などに対して安全です。

于 2011-02-08T23:15:08.793 に答える
7

これは Rails 3 に組み込まれている方法ではありませんが、Rails 3 で積極的に維持されている素晴らしい gem を見つけました: act_as_api

于 2010-09-17T05:06:58.423 に答える