降级rails项目到Ruby 1.9.3 |很有趣.to_json麻烦

时间:2014-03-25 15:53:00

标签: ruby-on-rails ruby-1.9.3 downgrade to-json

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

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

@sessions当然是结果列表。是否有人知道如何为此编写替代方案,也可以在旧版本的rails上运行?

提前致谢

亲切的问候

1 个答案:

答案 0 :(得分: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,允许渲染为你做。如果您需要调整JSON输出,请覆盖模型中的as_json,或直接致电as_json

立即修复您的代码以使用as_json - 迁移到Rails 3 or Ruby 1.9.3时,不用担心这一点。