当前位置: 首页 > 面试题库 >

如何在Rails中覆盖to_json?

蔺霄
2023-03-14
问题内容

未正确探讨此问题。真正的问题在于render :json

原始问题中的第一个代码粘贴将产生预期的结果。但是,仍然需要注意。请参阅以下示例:

render :json => current_user

一样的

render :json => current_user.to_json

也就是说,render :json不会自动调用to_json与User对象关联的方法。 实际上
,如果to_jsonUser模型上被覆盖,render :json => @user将生成以下ArgumentError描述。

摘要

# works if User#to_json is not overridden
render :json => current_user

# If User#to_json is overridden, User requires explicit call
render :json => current_user.to_json

这一切对我来说似乎很愚蠢。这似乎是在告诉我在指定类型时render实际上并没有在调用。有人可以解释这里的实际情况吗?Model#to_json``:json

任何可以帮助我解决这个问题的精灵都可以回答我的另一个问题:[如何通过在Rails中组合@ foo.to_json(options)和@bars.to_json(options)来构建JSON响应

原始问题:

我在SO上看到了其他一些示例,但是我没有做我想要的事情。

我尝试着:

class User < ActiveRecord::Base

  # this actually works! (see update summary above)
  def to_json
    super(:only => :username, :methods => [:foo, :bar])
  end

end

ArgumentError: wrong number of arguments (1 for 0)进去了

/usr/lib/ruby/gems/1.9.1/gems/activesupport-2.3.5/lib/active_support/json/encoders/object.rb:4:in `to_json

有任何想法吗?


问题答案:

你得到ArgumentError: wrong number of arguments (1 for 0),因为to_json需要重写一个参数options哈希值。

def to_json(options)
  ...
end

的更详细的解释to_jsonas_json和渲染:

在ActiveSupport 2.3.3中,as_json添加了解决您遇到的问题的方法。json 的 创建 应与json的 呈现 分开。

现在,随时to_json可以在对象as_json上调用,调用来创建数据结构,然后使用将该哈希编码为JSON字符串ActiveSupport::json.encode。所有类型均会发生这种情况:对象,数字,日期,字符串等(请参阅ActiveSupport代码)。

ActiveRecord对象的行为方式相同。有一个默认as_json实现,该实现创建一个包含所有模型属性的哈希。
您应该as_json在Model中重写以创建所需的JSON结构as_json,就像旧的一样to_json,采用选项哈希,您可以在其中指定要声明式包含的属性和方法。

def as_json(options)
  # this example ignores the user's options
  super(:only => [:email, :handle])
end

在您的控制器中,render :json => o可以接受字符串或对象。
如果是字符串,则将其作为响应主体传递,如果是对象,则将其作为响应主体to_json进行调用,并as_json如上所述触发。

因此,只要您的模型正确地用as_json覆盖(或不覆盖)表示,那么用于显示一个模型的控制器代码应如下所示:

format.json { render :json => @user }

这个故事的寓意是: 避免to_json直接打电话,允许render为您这样做。如果您需要调整JSON输出,请致电as_json

format.json { render :json => 
    @user.as_json(:only => [:username], :methods => [:avatar]) }


 类似资料:
  • 问题内容: 我目前在glassfish v2.1中使用基于身份的身份验证来登录用户,并且工作正常。我想切换到该网站,并希望能够获得最初请求的URL(即在重定向到登录页面之前),并在我的程序化登录代码中使用它,以便在身份验证后将用户重定向回请求的页面。 我已经看过源代码-在我的情况下,它是(catalina代码库),它将初始请求保存在会话中的对象中,但是该会话不是,因此没有直接方法可以访问它。 还是

  • 问题内容: 我想创建一个具有任意大小的div,然后在该div上显示一些内容。完全按照CSS中下面的div定位和调整叠加层大小的最佳方法是什么? 问题答案: 您可以使用将叠加层放置在div内部,然后在各个方向上将其拉伸,如下所示: CSS 已更新* 您只需要确保您的父div为其添加了属性,并为其设置了更低的属性。 为下面的评论者制作了一个可以在所有浏览器(包括IE7 +)上运行的演示。 从CSS中移

  • 我想重写java中的getProperty()方法。util。物业类别,请告知。 1.Spring上下文文件 2.Java类 3.配置文件 仅供参考:我正在从配置文件中提取批次值,并希望在从中获取值后调用trim()。属性,以避免代码冗余,尝试重写getProperty()方法。 使用:Spring 4.0

  • 问题内容: 我正在尝试Backbone.js,而我正在尝试的事情之一就是调用远程API,因此,据我了解的文档资料,我需要能够覆盖Backbone.sync 。 在文档本身中没有如何执行此操作的示例,并且似乎没有用于Backbone的google组…有人可以指出执行此操作的示例吗? 问题答案: 看看这个带注释的源示例,在该示例中,它们被本地存储替代项覆盖 基本上,Backbone.sync应该是一个

  • 问题内容: 我试图覆盖Java中的方法。我有一堂课,基本上有2个数据字段和。现在,我想重写方法,以便可以在2个对象之间进行检查。 我的代码如下 但是当我写它给我错误时,因为方法只能比较并且是。 Solution 我按照建议使用运算符,问题解决了。 问题答案: Output: `run: – Subash Adhikari - VS - K false – Subash Adhikari - VS

  • 问题内容: 我需要方法方面的帮助,这非常令人讨厌。我尝试在线查找,因为那是一个正在搞砸的地方,即使在那里,它也“找不到2号Kid构造函数”,我什至会做其他事情,但它不起作用。好了,所以这是我的代码: 好的,所以我上面的toString(我知道,我的第三个参数已关闭,应该是String)已关闭。如果我在第三件事中硬编码一个值,它就会变成麻烦,并说找不到它(上面)。那么如何获取日期并将其拆分呢? 调用