Дочерний блок RABL дает дочерний объект вместо родительского

Согласно документации RABL в разделе "Дочерние узлы" возможно следующее:

object @user
child :posts do |user|
  attribute :title unless user.suspended?
end

Это означает, что переменная user, выдаваемая блоком, является родительским объектом @user.

Однако, когда я пытаюсь сделать следующее:

collection @listings
child :address do |listing|
  attribute :number_and_street unless listing.address_hidden?
end

Я получаю NoMethodError:

undefined method `address_hidden?' for #<Address:0x007fb83d6eaf80>

это означает, что блок выдает дочерний объект адреса вместо родительского объекта @listing, как подразумевается в документации.

Единственный способ обойти это, который я вижу, это что-то вроде address.listing.address_hidden?, что приведет к слишком большому количеству запросов к базе данных, поэтому я бы хотел этого избежать.

Я делаю что-то неправильно? Есть ли способ исправить это поведение?


person eirikir    schedule 30.07.2013    source источник
comment
загляните в Active Model Serializers - гораздо проще, чем рабль ИМХО   -  person timpone    schedule 31.07.2013
comment
Спасибо @timpone, но мне приходится использовать RABL, потому что у него есть нужные мне возможности, которых нет у сериализаторов Active Model.   -  person eirikir    schedule 31.07.2013


Ответы (1)


Когда вы используете коллекцию, дочерний блок не дает отдельных объектов. Что бы я сделал, это разделить его на два файла.

index.json.rabl

collection @listing
extends "app/view/listings/base"

base.json.rabl

object @listing
child :address do |listing|
  attribute :number_and_street unless listing.address_hidden?
end

РЕДАКТИРОВАТЬ: я только что заметил, что вы используете драгоценный камень rabl-rails. Мое решение работает для «рабла», я не слишком уверен в этом камне :)

person Hassan Javeed    schedule 31.07.2013
comment
Спасибо за объяснение этой разницы, теперь все понятно! - person eirikir; 03.08.2013