2010-08-25 46 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