使用Rails3.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在不同的环境中自动调用哪些方法时……
谢谢你的见解!
发布于 2013-03-06 05:48:44
是的,这确实有效,但不是像你写的那样引用。
当您在控制器中使用
def action
render :json => @my_model
end然后Rails会自动对你的对象调用to_json,只要你定义了to_json,它就会像预期的那样工作。
如果您的控制器使用Rails3内容协商恶作剧,即。
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包含到您的类中,并且您的类支持返回属性及其值的散列的attributes方法-那么您将免费获得as_json -但是如果您只是手动覆盖该方法,则不会控制您所拥有的结果结构。
希望这能有所帮助。
https://stackoverflow.com/questions/15233990
复制相似问题