Как делегировать метод to_builder модели из представления JBuilder?

Допустим, у меня есть класс Person и класс Gang.

class Person
  belongs_to :gang
  attr_accessible :name, :secret

  def to_builder
    Jbuilder.new do |app|
      person.id id
      person.name name
    end
  end
end

class Gang
  has_many :people
  attr_accessible :name
end

Как использовать этот метод to_builder из представления?

Например

#app/views/gang/show.json.jbuilder (@gang set by the controller)

json.gang do |json|
  json.name @gang.name
  json.gang_members(@gang.people) do |person|
     #how do I delegate to the person.to_builder here?
  end
end

Имейте в виду, я никогда не хочу просто использовать Person.as_json по умолчанию, потому что я не хочу отображать атрибут secret для Person.

Большинство вещей, которые я пробовал, в конечном итоге отображали эквивалент Person.as_json, а не Person.to_builder.


person Chris Aitchison    schedule 28.03.2013    source источник


Ответы (2)


Вы можете использовать Jbuilder#attributes!. Я имею в виду

json.gang do |json|
  json.name @gang.name
  json.gang_members @gang.people.map { |person| person.to_builder.attributes! }
end
person yasuoza    schedule 11.04.2013
comment
Как насчет одного объекта на верхнем уровне? Как в действии gang_member#show.json? - person Blake Miller; 25.12.2013

Используйте Jbuilder#merge!, чтобы объединить атрибуты из конструктора людей.

json.gang do
  json.name @gang.name
  json.gang_members(@gang.people) do |person| 
    json.merge! person.to_builder.attributes!
  end
end
person Nathan    schedule 06.12.2014