2010-07-08 52 views
1

我有一個Ruby on Rails應用程序,我正在爲關聯的iPhone應用程序使用API​​。自定義to_json方法不在Rails應用程序中調用

我已覆蓋我的Item模型的to_json方法,以便從iPhone應用程序需要的API請求中返回一些自定義信息。

但是,當我使用內置的rails to_json方法並將我的Item模型作爲關聯參數包含時,我的Item#to_json方法未被調用,並且僅調用AR對象的默認to_json。

請看下面的代碼(@api_user is a User model object

render :json => @api_user.to_json(:include => { :friends => { :include => :items, :except => :api_token } }) 

我包括friends協會,又包括items ASSOCATION,但對項目的默認to_json被調用,而不是我的自定義to_json。

我錯過了什麼?

這裏是我的Item#to_json方法

def to_json(options={}) 
{ 
    :id => self.id, 
    :name => name, 
    :description => description, 
    :url => url, 
    :quantity => quantity, 
    :price_range_raw => price_range, 
    :price_range => human_readable_price_range(price_range), 
    :can_be_purchased => can_be_purchased?, 
    :completely_purchased => completely_purchased?, 
    :remaining_qty => remaining_quantity, 
    :thumb_photo_url => photo.url(:thumb), 
    :small_photo_url => photo.url(:small), 
    :large_photo_url => photo.url(:large), 
    :priority_raw => priority, 
    :priority => human_readable_priority(priority) 
}.to_json 

沒有其他車型有#to_json方法重寫

+0

你可以顯示你的'to_json'方法嗎?我最初的猜測是'User'的'to_json'方法不會遞歸地調用'Item',或者'to_json'方法接受不同的參數,而調用某種'method_missing'方法。 – Karl 2010-07-08 16:53:15

+0

當然,我已經將它添加到 – cpjolicoeur 2010-07-08 17:19:42

+2

我在挖掘源代碼,我的猜測是枚舉的ActiveSupport JSON編碼器不會在每個項目上調用to_json,而是將整個數組作爲一個序列化。我可能不得不寫我自己的映射函數,我想傳回像我想要的數據 – cpjolicoeur 2010-07-08 17:28:10

回答

1

您使用的設計?如果是這樣,他們覆蓋to_json和to_xml方法(謝謝,夥計們)。

從設計來源:

%w(to_xml to_json).each do |method| 
    class_eval <<-RUBY, __FILE__, __LINE__ 
     def #{method}(options={}) 
     if self.class.respond_to?(:accessible_attributes) 
      options = { :only => self.class.accessible_attributes.to_a }.merge(options || {}) 
      super(options) 
     else 
      super 
     end 
     end 
    RUBY 
    end 
+0

這個方法仍然調用'super()',所以它仍然會套用我的自定義方法 – cpjolicoeur 2011-07-09 11:27:19

0

沒有覆蓋to_json方法更簡單的方法是什麼?使用設計不解決一般問題。爲什麼我可能希望選擇不列出特定對象的某些屬性,因此需要自定義方法的原因有很多。

相關問題