Ошибочный дубликат вложенного объекта JSON - Rails

У меня есть API Rails, который возвращает JSON с помощью драгоценного камня rabl. Вот шаблон /show, который также расширен до шаблона /index.

object @deal
attributes :headline, :text, :image, :id, :created_at

child :vendor do
    attributes :image_url, :id
end

И Deal, и Vendor имеют изображения, загруженные через CarrierWave/Fog на S3. Проблема, которую я здесь вижу, заключается в том, что мой возвращенный JSON включает дополнительный объект image для deal. Вот так:

"deal":{"image":{"image":{"url":"httpxxxxxxxxxxxx"}}}

Напротив, JSON для поставщика возвращает правильное значение:

"vendor":{"image_url":"httpxxxxxxxxxxx"}

Мои загрузчики, как показано ниже:

class DealUploader < CarrierWave::Uploader::Base
   def store_dir
     "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
   end
end

# vendor image uploader
class ImageUploader < CarrierWave::Uploader::Base
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end
end

Почему я получаю этот лишний объект image?


person settheline    schedule 27.06.2014    source источник
comment
Что произойдет, если вы закомментируете три дочерние строки :vendor? Каково содержание шаблона Vendor rabl?   -  person ReggieB    schedule 27.06.2014
comment
Та же проблема с deal, к сожалению.   -  person settheline    schedule 27.06.2014
comment
Каково содержание шаблона Vendor rabl?   -  person ReggieB    schedule 27.06.2014
comment
У меня его нет, vendor отображается как дочерний элемент deal.   -  person settheline    schedule 27.06.2014
comment
Тогда атрибуты сделки не должны быть: атрибуты :headline, :text, :image_url, :id, :created_at. То есть, используя :image_url вместо :image   -  person ReggieB    schedule 27.06.2014


Ответы (1)


Пытаться

object @deal
attributes :headline, :text, :image_url, :id, :created_at

child :vendor do
    attributes :image_url, :id
end
person ReggieB    schedule 27.06.2014
comment
Хорошо, это сработало, спасибо. Почему image возвращает лишний объект? Как-то связано с загрузчиком CarrierWave? - person settheline; 27.06.2014
comment
Я ожидаю, потому что Deal.image возвращает объект загрузки изображения, и rabl делает все возможное, чтобы представить объект в JSON. Deal.image_url — это метод, который возвращает строку (URL-адрес загруженного файла), поэтому в JSON он представлен просто как image_url: url_string. - person ReggieB; 28.06.2014