在我的Item控制器中,我希望在将其呈现为JSON之前向模型对象添加一个瞬态(即非持久)属性。
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输出中呈现注释?
感谢您的帮助。
--------------更新
这是从Chubas建议中演变而来的解决方案。覆盖Item:
上的to_json方法def to_json(options = {})
options[:methods] = :comment;
super(options)
end
很想知道这是否与你的想法一致,Chubas。
答案 0 :(得分:2)
我建议您自己构建要转换为json的对象。这两者都将消除您对评论的问题,并防止您意外地泄露您不想提供的信息。
类似的东西:
render :json => {
:item => {
:name => 'Some Item',
...
:comment => 'Some Comment
}
}
答案 1 :(得分:1)
如果您想要更多地控制渲染的内容,而不是在控制器中创建json对象(设计错误),请覆盖方法as_json
in the model,调用super并使用{{1} }选项包括methods
。您可以看到默认行为here
答案 2 :(得分:1)
您应该可以使用:include
来完成此操作@item.to_json(:include => :comments)
或:方法
@item.to_json(:methods => :comments)
答案 3 :(得分:0)
我认为你不应该覆盖to_json方法。为什么不在调用to_json之前将属性添加到对象的哈希?
@object[:new_attr] = value