2

現在、私のRailsアプリケーションのAPIに属性を組み込もうとしています。ユースケースは単純です。私はこのUserEventモデルを使用してイベントに関連するすべてのユーザーを一覧表示することができるようにしたいJSONとXMLの両方で追加の属性

class UserEvent < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :event 
end 

:私は別のモデル、基本的にイベントにユーザーをリンクを持っている

class User < ActiveRecord::Base 
    attr_accessible :email 
end 

:私は、Userモデルを持っていますJSONまたはXMLとしてアクセス可能なAPIを介して、私はUserEventの電子メールをXMLとJSONの両方のダンプに表示したいと思います。 serializable_hashは私が研究してきた別のアプローチは、私のクラスの属性メソッドをオーバーライドすることでしたto_xml

で使用されていないように見えるよう

This questionは、私はちょうどserialiable_hashを上書きすることができ、よくこれだけJSONのために働くように見えることを示唆しています:

class UserEvent < ActiveRecord::Base 
    def attributes 
    @attributes = @attributes.merge "email" => self.email 
    @attributes 
    end 
end 

これは、JSONのためにうまく動作しますが、XMLのバージョンをしようとしたときにエラーがスローされます。

undefined method `xmlschema' for "2011-07-12 07:20:50.834587":String 

この文字列は、オブジェクトの "created_at"属性であることが判明しました。だから私はここで操作しているハッシュに何か間違っているように見える。

答えて

2

includeを使用すると、ネストされたデータをAPIレスポンスに簡単に追加できます。ここでは例があります:あなたはまた、Userで逆の関連付けを追加する必要があります

respond_with(@user, :include => :user_event)

:あなたは複数のモデルのために:includeに配列で渡すことができます

has_many :user_events

。それは適切に応答して直列化して入れ子にします。

+0

私の質問では言及しなかったのは、いくつかのコントローラで考慮する必要があるため、モデルでこれを実行したいということです。 – rpechayr

+1

問題ありません!あなたのモデルで 'as_json'をオーバーライドするだけです。このメソッドは、モデルオブジェクトがJSONにシリアル化されるたびに呼び出されるため、どこでも使用されます。 \t def as_json(options = {}) super options.merge(include:user_event) end' –

関連する問題