плохо знаком с Ruby / Rails, так что терпите меня.
У меня есть класс модели ActiveRecord Статус . Я передаю его как json для использования в мобильном веб-приложении. Он состоит из id, имени, кода и back_color (в десятичном цвете). Мне нужно было преобразовать цвет из десятичного числа BGR в шестнадцатеричный RGB, поэтому я решил использовать драгоценный камень color . В конечном счете, однако, я думаю, что проблема фундаментальна для моего определения метода.
Когда я запрашиваю одну запись (/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, но не для действия index.