【问题标题】:Ruby on Rails: Problem adding Transient Attribute to Object for JSON SerializatonRuby on Rails:向对象添加瞬态属性以进行 JSON 序列化时出现问题
【发布时间】:2011-04-03 19:48:01
【问题描述】:

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

【问题讨论】:

标签: ruby-on-rails ruby json


【解决方案1】:

我建议您自己构造要转换为 json 的对象。这既可以消除您在评论中遇到的问题,也可以防止您意外暴露您不想提供的信息。

类似:

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

【讨论】:

    【解决方案2】:

    如果您想要更多地控制要呈现的内容,而不是在控制器中创建 json 对象(糟糕的设计),请覆盖方法 as_json in the model,调用 super 并使用 methods 选项来包含 @987654325 @。可以看到默认行为here

    【讨论】:

    • 您好,感谢您的回复。我想实现这种方法,但我发现自己正在摸索试图弄清楚被覆盖的 as_json 方法应该是什么样子。你有没有机会进一步描述这个解决方案?再次感谢。
    【解决方案3】:

    你应该可以通过使用 :include 来做到这一点

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

    或:方法

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

    【讨论】:

      【解决方案4】:

      我认为您不应该覆盖 to_json 方法。为什么不在调用 to_json 之前将属性添加到对象的哈希中?

      @object[:new_attr] = value
      

      【讨论】:

        猜你喜欢
        • 2021-03-28
        • 2010-10-10
        • 1970-01-01
        • 2011-07-05
        • 1970-01-01
        • 2012-01-28
        • 1970-01-01
        • 1970-01-01
        • 2010-12-18
        相关资源
        最近更新 更多