亲爱的stackoverflow人, 我想降级rails项目,以便它可以在rails 3上运行而没有任何问题。它之前在最新版本的rails上运行,但办公室不想使用这个。我在重写这一特定行时遇到了麻烦:
@results = @sessions.to_json(:include => [:orientations, :subtopics, :data_files, :participants, :formats, :comments => {:include => [:user => {:only => [:id, :name]}]}])
@sessions当然是结果列表。是否有人知道如何为此编写替代方案,也可以在旧版本的rails上运行?
提前致谢
亲切的问候
答案 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
时,不用担心这一点。