0

亲爱的stackoverflow人,我想降级一个rails项目,这样它就可以在rails 3上运行而没有任何问题。它以前在最新版本的 rails 上工作过,但办公室不想使用这个。我在重写这一行时遇到了麻烦:

@results = @sessions.to_json(:include => [:orientations, :subtopics, :data_files, :participants, :formats, :comments => {:include => [:user => {:only => [:id, :name]}]}])

@sessions 当然是结果列表。有谁知道我如何为此编写一个也可以在旧版本的 Rails 上运行的替代方案?

提前致谢

亲切的问候

4

1 回答 1

1

干得好:

任何时候在对象上调用 to_json 时,都会调用 as_json 来创建数据结构,然后使用 ActiveSupport::json.encode 将该哈希编码为 JSON 字符串。这适用于所有类型:对象、数字、日期、字符串等(参见 active_support/json)。

ActiveRecord 对象的行为方式相同。有一个默认的 as_json 实现,它创建一个包含所有模型属性的 Hash。您应该在模型中覆盖 as_json 以创建所需的 JSON 结构。as_json 就像旧的 to_json 一样,采用选项哈希,您可以在其中指定要包含的属性和方法来装饰性地包含。

def as_json(options={})
  super(:only => [:email, :avatar], :include =>[:addresses])
end

显示一个模型的控制器代码应始终如下所示:

render :json => @user

如果您必须做任何不寻常的事情,请调用 as_json 传递您的选项。

render :json => { :success => true, 
  :user => @user.as_json(:only => [:email]) }

这个故事的寓意是:在控制器中,不要to_json直接调用,让 render 为你做这件事。如果您需要调整 JSON 输出,as_json在您的模型中覆盖,或as_json直接调用。

立即修复您的代码以供使用as_json- 当您迁移到Rails 3 or Ruby 1.9.3.

于 2014-03-25T16:13:22.303 回答