Ruby on Rails:将瞬态属性添加到对象以进行JSON序列化的问题

时间:2010-08-25 15:48:31

标签: ruby-on-rails ruby json

在我的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。

4 个答案:

答案 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