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

And*_*rew 0 json ruby-on-rails active-model-serializers

使用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
Run Code Online (Sandbox Code Playgroud)

这应该按预期工作,还是我还需要包含ActiveModel::Serializers::JSON?我很难搞清楚as_json/ to_json方法通常定义的位置以及Rails何时在不同情况下自动调用哪些方法...

感谢您的任何见解!

eig*_*tor 5

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

使用时在控制器中渲染json

def action
  render :json => @my_model
end
Run Code Online (Sandbox Code Playgroud)

然后Rails将自动调用to_json您的对象,只要您已定义to_json它将按预期工作.

如果您的控制器使用Rails 3内容协商shenanigans,即.

class Controller < ApplicationController
  respond_to :json, :html

  def action
    respond_with(@my_model)
  end
Run Code Online (Sandbox Code Playgroud)

然后你需要覆盖as_json你的类,但是方法签名需要一个可选的hash选项以与ActiveSupport兼容,所以在这种情况下你想要

def as_json(options={})
  ...
end
Run Code Online (Sandbox Code Playgroud)

或者,如果你包含ActiveModel::Serializers::JSON在你的类中,并且你的类支持attributes返回attrs散列及其值的方法 - 那么你将获得as_json免费 - 但如果你只是手动覆盖方法,则无法控制结果结构.

希望这可以帮助.