Rails:非ActiveRecord模型需要包含ActiveModel :: Serializers,还是只响应#as_json?

时间:2013-03-05 20:58:40

标签: ruby-on-rails json active-model-serializers

使用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在不同情况下自动调用哪些方法......

感谢您的任何见解!

1 个答案:

答案 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 - 但如果您只是手动覆盖方法,则无法控制所得到的结构。

希望这有帮助。