2013-09-25 3 views
0

У меня возникли трудности с получением моей «формы обновления» для отображения вложенных атрибутов. В частности, изображения (например, «выбор») для отображения. Все остальные поля данных отображаются. Только не это моя форма:Rails - Показать вложенные атрибуты в форме «Обновить»

<%= bootstrap_form_for @template, :url => {:action => 'update', :id => @template.id } do |f| %> 
<fieldset> 
    <legend>Update Your Template</legend> 
    <%= f.text_field :prompt, :class => :span6, :placeholder => "Which one is running?", :autocomplete => :off %> 
    <%= f.select 'group_id', options_from_collection_for_select(@groups, 'id', 'name', selected: @template.group.id) %> 
    <div class="row-fluid"> 
    <ul class="thumbnails"> 
     <%= f.fields_for :template_assignments do |builder| %> 
     <li class="span3" id=""> 
     <div class="thumbnail"> 
      <%= builder.text_field :choice_id %> 
      <%= image_tag @template.template_assignments.builder.choice.image %> 
     </div> 
     </li> 
     <% end %> 
    </ul> 
    </div> 
<% end %> 

Основная линия у меня возникли проблемы с является:

<%= image_tag @template.template_assignments.builder.choice.image %>

Я не могу получить его, чтобы перебирать каждый из 4-х вложенных атрибутов изображения. Он выполняет итерацию с помощью 4 вложенных атрибутов, относящихся к: choice_id, который отображается правильно в текстовом поле.

Если я изменить его на:

<%= image_tag @template.template_assignments.first.choice.image %>, он отображает первое изображение не проблема.

Однако мне нужно, чтобы он повторялся и отображал «первое», «второе», «третье» и «четвертое» изображения.

Любая помощь в том, как отображать эти изображения, точно так же, как отображаются изображения image_id?

EDIT: Вот мои модели

# app/models/template.rb 

class Template < ActiveRecord::Base 
belongs_to :group 
has_many :template_assignments, dependent: :destroy 
has_many :choices, :through => :template_assignments 
accepts_nested_attributes_for :template_assignments, allow_destroy: true 
end 

 

# app/models/template_assignment.rb 

class TemplateAssignment < ActiveRecord::Base 
belongs_to :template 
belongs_to :choice 
end 

 

# app/models/choice.rb 

class Choice < ActiveRecord::Base 
    has_many :template_assignments 
    has_many :templates, :through => :template_assignments 
end 

ответ

1

Вы, вероятно, хотите просто использовать builder, так же, как вы делаете в text_field.

<%= image_tag builder.choice.image %> 

[UPDATE] после некоторых проб и ошибок правильной формы будет:

<%= image_tag builder.object.choice.image %> 

То, что происходит в том, что, когда f.fields_for :template_assignments do |builder| используется для отображения вложенных элементов, в builder объект, который yield Эда блок не является самим объектом (в данном случае TemplateAssignment), но является объектом FormBuilder, что и предоставляет удобные методы, такие как builder.text_field. (Если вы попытались сделать template_assignment.text_field, вы получите сообщение об ошибке.) builder сохраняет объект, который он представляет в форме object, поэтому вы можете получить ваш объект template_assignment, используя builder.object. Оттуда вы можете найти template_assignment, как обычно. Надеюсь, это поможет.

+0

Спасибо Джереми. Но это не работает. Я не знаю, связано ли это с тем, что «choice.image» находится в собственной таблице. Я обновил OP, чтобы показать свои модели. – Dodinas

+0

Чтобы быть более конкретным, когда я использую ваше предложение, я получаю следующую ошибку: '" NoMethodError: undefined method 'choice '" ' – Dodinas

+0

Возможно, попробуйте' <% = image_tag builder.object.choice.image%> '? –

Смежные вопросы