'as_json'中的类方法不适用于索引操作

时间:2012-01-04 18:24:06

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

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

我有一个ActiveRecord模型类状态。我将它渲染为json,用于移动Web应用程序。它由 id,name,code和back_color (十进制颜色)组成。我需要进行从BGR十进制到RGB十六进制的颜色转换,所以我决定使用颜色 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

...它适用于show和index操作。只要我以任何身份介绍彩色宝石,它都不起作用。同样,我将这归因于我如何使用宝石,而不是宝石本身的问题。

我忽略了什么核心原则?

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

2 个答案:

答案 0 :(得分:1)

数据库中的某个状态是否存在错误数据(这样它不再是Color::RGB.from_html的有效输入)?这会导致加载整个集合的操作引发错误,但不会导致大多数个别问题。

答案 1 :(得分:-1)

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

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