0

使用 Rails 3.2,我正在开发一个 API 支持的模型(不是 ActiveRecord)。我希望能够to_json在 Rails 控制器中调用这个模型。在阅读了一堆 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 何时在不同情况下自动调用哪些方法......

感谢您的任何见解!

4

1 回答 1

5

是的,这确实有效,但不要像你写的那样引用。

当您使用在控制器中渲染 json 时

def action
  render :json => @my_model
end

然后 Rails 会自动调用to_json你的对象,只要你定义to_json了它就会按预期工作。

如果您的控制器使用 Rails 3 内容协商恶作剧,即。

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返回 attrs 及其值的哈希的方法 - 那么您将as_json免费获得 - 但如果您只是手动覆盖该方法,则无法控制您拥有的结果结构.

希望这可以帮助。

于 2013-03-05T21:48:44.367 回答