【问题标题】:Rails: do non-ActiveRecord models need to include ActiveModel::Serializers, or just respond to #as_json?Rails:非 ActiveRecord 模型需要包含 ActiveModel::Serializers,还是只响应 #as_json?
【发布时间】:2013-03-05 20:58:40
【问题描述】:

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

感谢您的任何见解!

【问题讨论】:

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


    【解决方案1】:

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

    当你在控制器中渲染 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 包含到您的类中并且您的类支持返回attrs 及其值的哈希值的attributes 方法 - 那么您将免费获得as_json - 但无法控制结果如果您只是手动覆盖该方法,您将拥有的结构。

    希望这会有所帮助。

    【讨论】:

    • 感谢“或者,如果您将 ActiveModel::Serializers::JSON 包含到您的类中,并且您的类支持返回 attrs 及其值的哈希值的属性方法”,这对我实现一个关键PORO 使用 AR 序列化器。
    猜你喜欢
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 2014-06-19
    相关资源
    最近更新 更多