使用Rails 3.2,我正在研究API支持的模型(不是ActiveRecord)。我希望能够在Rails控制器中对此模型调用to_json
。在阅读了一堆ActiveModel文档后,我仍然不清楚一件事:
鉴于这样的模型:
class MyModel
attr_accessor :id, :name
def initialize(data)
@id = data[:id]
@name = data[:name]
end
def as_json
{id: @id, name: @name}
end
end
这应该按预期工作,还是我还需要包含ActiveModel::Serializers::JSON
?我很难确定通常定义as_json
/ to_json
方法的位置以及Rails在不同情况下自动调用哪些方法......
感谢您的任何见解!
答案 0 :(得分:5)
是的,这确实有效,但不会像你写的那样引用。
使用
在控制器中渲染json时def action
render :json => @my_model
end
然后Rails会自动为您的对象调用to_json
,只要您已定义to_json
,这将按预期工作。
如果你的控制器使用Rails 3内容协商shenanigans,即
class Controller < ApplicationController
respond_to :json, :html
def action
respond_with(@my_model)
end
然后,您需要覆盖类上的as_json
,但方法签名需要一个可选的散列选项才能与ActiveSupport兼容,因此在这种情况下您需要
def as_json(options={})
...
end
或者如果您在课程中加入ActiveModel::Serializers::JSON
,并且您的班级支持返回attrs及其值的哈希的attributes
方法,那么您将免费获得as_json
- 但如果您只是手动覆盖方法,则无法控制所得到的结构。
希望这有帮助。