0

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

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

当我请求一条记录 ( /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

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

我忽略了哪些核心原则?

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

4

2 回答 2

1

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

于 2012-01-04T22:03:36.053 回答
-1

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

def to_json(options={})
  super(:methods => :color_hex)
end
于 2012-01-04T18:49:14.377 回答