2010-08-25 16 views
3

在我的Item控制器中,我希望在將模型對象呈現爲JSON之前向其添加瞬態(即非持久)屬性。Ruby on Rails:爲JSON添加瞬態屬性到對象的問題Serializaton

def show 

    @item = Item.find(params[:id]) 
    @item.comment = "some comment" 

    render :json => @item 
end 

我Item類看起來是這樣的:

class Item < ActiveRecord::Base 

    attr_accessor :comment 
    @comment 

我的問題是,註釋實例變量沒有被在JSON呈現。在JSON輸出中顯示持久性的所有內容。我是否需要重寫to_json方法才能使其工作?還是有更簡單的方法來確保評論在JSON輸出中呈現?

感謝您的幫助。

--------------更新

這是一個已經發展了藏袍建議的解決方案。重寫to_json方法Item:

def to_json(options = {}) 

    options[:methods] = :comment; 

    super(options) 

end 

想知道這是否與您的想法一致,Chubas。

+0

看到這個類似的帖子http://stackoverflow.com/questions/2572284/override-to-json-in-rails-2-3-5/2574900 – Chubas 2010-08-25 16:20:08

+0

又見......「你一般要單獨留下to_json,所以你需要做的就是添加你自己的as_json實現,就像這樣...「http://stackoverflow.com/questions/6892044/add-virtual-attribute-to-json-output – msanjay 2012-12-20 15:44:03

回答

1

如果你想在什麼來呈現,而不是在控制器(糟糕的設計)創建JSON對象更多的控制權,覆蓋的方法as_jsonin the model,稱超級使用methods選項包括:comment。您可以看到默認的行爲here

+0

你好,感謝您的回覆..我想實現這種方法,但我發現自己摸索着弄清楚重寫的as_json方法應該是什麼樣子。你有什麼機會可以進一步描述這個解決方案?再次感謝。 – 2010-08-25 17:33:10

2

我會建議你構建要轉換爲json的對象。這兩方面都將消除您對評論所帶來的問題,並可防止您意外泄露您不想提供的信息。

喜歡的東西:

render :json => { 
    :item => { 
    :name => 'Some Item', 
    ... 
    :comment => 'Some Comment 
    } 
} 
1

您應該能夠通過使用要做到這一點:包括

@item.to_json(:include => :comments) 

或:方法

@item.to_json(:methods => :comments) 
0

我不認爲你應該覆蓋to_json方法。爲什麼不在調用to_json之前將屬性添加到對象的哈希?

@object[:new_attr] = value 
相關問題