2011-01-22 37 views
0

我有一個模型具有一個虛擬屬性,我希望在模型呈現爲JSON時包含這個屬性。我已經做到了這一點:to_json選項[:方法]不適用於Model.all

def to_json(options={}) 
    options[:methods] ||= []; 
    options[:methods] << :date_string; 
    super(options); 
end 

這增加了我的date_string方法的屬性列表生產JSON時呈現。

在我的控制器,顯示動作產生正確的結果,使date_string彷彿這只是一個正常的屬性:

def show 
    @project = Project.find params[:id] 
    respond_to do |format| 
     format.html 
     format.json { render :json => @project } 
    end 
    end 

但指數動作不包括date_string

def index 
    @projects = Project.all 
    respond_to do |format| 
     format.html 
     format.json { render :json => @projects } 
    end 
    end 

有沒有人知道是否有可能得到這個工作?我猜測它在呈現集合時並未使用特定於模型的to_json


編輯:看起來也許我應該使用as_json現在 - 我會看看是否能解決這個問題。我不認爲as_json這裏有什麼區別。

回答

1

as_json應該工作。 to_json將該值轉換爲json並對其進行編碼。 as_json在沒有編碼的情況下進行轉換。數組轉換自己的對象,而無需編碼,然後編碼一氣呵成整個字符串,它是你的模型as_json()方法被調用時數組進行序列化:

https://github.com/rails/rails/blob/master/activesupport/lib/active_support/json/encoding.rb#L215

我能夠在本地複製您的問題,此解決方案爲我工作:

def as_json(options={}) 
    options ||= {} # need this because to_json without options will pass nil to as_json 
    options[:methods] ||= []; 
    options[:methods] << :date_string; 
    super(options); 
end 
+0

謝謝,這是做到了。我曾嘗試過'as_json',但沒有'options || = {}'行 - 爲我排序。乾杯:) – Skilldrick

2

望着ActiveModel::Serialization docs,它看起來像你可以重寫serializable_hash方法包括虛擬領域:

def serializable_hash(options) 
    super(options.deepmerge({:methods => :date_string})) 
end 

注意,這將其添加到所有序列化格式(即JSON和XML)。

如果這不起作用,請添加一些日誌記錄以查看該方法是否在集合案例中被調用。

+0

感謝你 - 看起來很有用。如果我需要在任何時候序列化爲XML,我會再看一次。 – Skilldrick

相關問題