首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails:非ActiveRecord模型是否需要包含ActiveModel::Serializer,或者只是响应#as_json?

Rails:非ActiveRecord模型是否需要包含ActiveModel::Serializer,或者只是响应#as_json?
EN

Stack Overflow用户
提问于 2013-03-06 04:58:40
回答 1查看 1.2K关注 0票数 0

使用Rails3.2,我正在开发一个基于API的模型(而不是ActiveRecord)。我希望能够在Rails控制器中对此模型调用to_json。在阅读了一大堆ActiveModel文档后,我仍然不清楚一件事:

给定一个这样的模型:

代码语言:javascript
复制
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在不同的环境中自动调用哪些方法时……

谢谢你的见解!

EN

回答 1

Stack Overflow用户

发布于 2013-03-06 05:48:44

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

当您在控制器中使用

代码语言:javascript
复制
def action
  render :json => @my_model
end

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

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

代码语言:javascript
复制
class Controller < ApplicationController
  respond_to :json, :html

  def action
    respond_with(@my_model)
  end

然后,您将需要覆盖类上的as_json,但方法签名需要一个可选的选项散列以与ActiveSupport兼容,因此在本例中您希望

代码语言:javascript
复制
def as_json(options={})
  ...
end

或者,如果您将ActiveModel::Serializers::JSON包含到您的类中,并且您的类支持返回属性及其值的散列的attributes方法-那么您将免费获得as_json -但是如果您只是手动覆盖该方法,则不会控制您所拥有的结果结构。

希望这能有所帮助。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15233990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档