2

我目前正在嘗試在我的Rails應用程序的API中加入屬性。用例很簡單。我有一個用戶模式:JSON和XML中的其他屬性

class User < ActiveRecord::Base 
    attr_accessible :email 
end 

我有另一種模式,基本上是用戶鏈接到事件:

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

我希望能夠列出使用UserEvent模型與事件相關的所有用戶通過可以以JSON或XML訪問的API,並且我希望我的UserEvent的電子郵件同時出現在XML和JSON轉儲中。

This question表明,我可以只覆蓋serialiable_hash,以及這似乎只對JSON的工作,因爲它看起來像serializable_hash沒有被to_xml

我已經調查的另一種方法是重寫屬性方法在我的班級:

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響應中。這裏有一個例子:

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

你也應該在User添加反向關聯:

has_many :user_events

您可以在一個數組傳遞給:include多個型號。它將序列化並將它們嵌套在響應中。

+0

我在我的問題中沒有提到的是我想在模型中這樣做,因爲它必須在幾個控制器中考慮到。 – rpechayr

+1

沒問題!在你的模型中重寫'as_json'。每次將模型對象序列化爲JSON時都會調用此方法,因此它將在任何地方使用。 \t'def as_json(options = {}) super options.merge(include::user_event) end' –