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动作,但不适用于索引操作。
答案 0 :(得分:1)
数据库中的某个状态是否存在错误数据(这样它不再是Color::RGB.from_html
的有效输入)?这会导致加载整个集合的操作引发错误,但不会导致大多数个别问题。
答案 1 :(得分:-1)
您只需将as_json方法重命名为to_json
即可def to_json(options={})
super(:methods => :color_hex)
end