【问题标题】:Class Method in 'as_json' not working for index action“as_json”中的类方法不适用于索引操作
【发布时间】:2012-02-02 15:40:36
【问题描述】:

Ruby/Rails 新手,请耐心等待。

我有一个 ActiveRecord 模型类Status。我将其渲染为 json 以在移动 Web 应用程序中使用。它由id、名称、代码和back_color(十进制颜色)组成。我需要进行从 BGR 十进制到 RGB 十六进制的颜色转换,所以我决定使用 color gem。但最终,我认为这个问题是我的方法定义的基础。

当我请求一条记录 (/statuses/1.json) 时,一切都按预期工作。当我请求索引 (/statuses.json) 时,我收到内部服务器错误 (500)。我能从中获得的最详细信息是ArgumentError (ArgumentError)

我定义了这样的转换方法:

def color_hex
 bgr = Color::RGB.from_html(back_color.to_s(16)) #converts dec to hex, then creates new color object from it
 rgb = Color::RGB.new(bgr.blue,bgr.green,bgr.red) #swaps red & blue into new color object
 rgb.html #outputs rgb hex for use in html
end

我还在模型中包含了一个自定义的as_json,添加了color_hex方法:

def as_json(options={})
  super(:methods => :color_hex)
end

在我的控制器中,我使用标准的format.json { render :json => @statuses }

正如我所说,我认为这是一个基本问题,所以我将方法简化为概念验证:我至少可以操纵 back_color 吗?

def color_hex
 back_color * -1
end

...它适用于显示和索引操作。一旦我以任何身份介绍彩色宝石,它就不起作用。同样,我将其归因于我使用 gem 的方式,而不是 gem 本身的问题。

我忽略了哪些核心原则?

TL,DR:我正在渲染为 json,我的自定义方法适用于 show 操作,但不适用于 index 操作。

【问题讨论】:

  • 您的 log/development.log 文件中有更多详细信息吗?可能是您的数据库中的状态之一包含错误数据(因此它不再是Color::RGB.from_html 的有效输入)
  • @FrederickCheung 我不确定这里的礼仪……我想将此标记为已回答,但我不想带走您的“代表”。您可以发表您的评论作为答案吗?

标签: ruby-on-rails ruby json methods gem


【解决方案1】:

可能是您的数据库中的状态之一包含错误数据(因此它不再是Color::RGB.from_html 的有效输入)?这会导致加载整个集合的操作引发错误,但不会对大多数单独的集合造成问题。

【讨论】:

  • facepalm - 现在你已经说过了,这似乎很明显。事实上,这似乎是一个数据问题。尝试加载第 7 条记录的单个实例会导致同样的问题!我相信对数据的额外检查(在Color::RGB.from_html 之前)将是这里的解决方案。谢谢@FrederickCheung!
【解决方案2】:

你只需要将 as_json 方法重命名为 to_json

def to_json(options={})
  super(:methods => :color_hex)
end

【讨论】:

  • 虽然我一直在读到我应该避免使用to_json 而使用as_json,但我还是试了一下。行为是相同的。它适用于单个(显示)操作,但不适用于全部(索引)操作。
猜你喜欢
  • 1970-01-01
  • 2021-08-13
  • 2014-03-11
  • 1970-01-01
  • 1970-01-01
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多