Метод класса в as_json не работает для действия индекса - PullRequest
0 голосов
/ 04 января 2012

плохо знаком с 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.

Ответы [ 2 ]

1 голос
/ 05 января 2012

Может ли быть так, что один из статусов в вашей базе данных содержит неверные данные (например, это больше не допустимый ввод для Color::RGB.from_html)? Это приведет к тому, что действие, которое загружает всю коллекцию, вызовет ошибку, но не вызовет проблемы с большинством отдельных.

0 голосов
/ 04 января 2012

Вам просто нужно переименовать метод as_json в to_json

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