2013-03-28 4 views
6

Скажем, у меня есть класс Person и Gang классКак мне передать метод to_builder модели из представления JBuilder?

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.as_json, а не Person.to_builder.

ответ

6

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

json.gang do |json| 
    json.name @gang.name 
    json.gang_members @gang.people.map { |person| person.to_builder.attributes! } 
end 
+5

А как насчет одного объекта на верхнем уровне? Как в gang_member # show.json action? –

2

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

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