2014-10-12 5 views
0

Я использую this cool gem ryanb nested_forms, но я не могу заставить его работать правильно ...Rails глубоко вложенной формы с nested_form жемчужину

У меня есть два уровня вложенных форм.

class Etude 
    has_many :phases 

class Phase 
    has_many :affectations 

class Affectation 

В основном, чтобы сделать вещи просто, у меня есть таблица фаз, и для каждой фазы у меня есть ячейка таблицы, где я положил свою вложенную таблицу жеманничанья. Я использую <%= f.object.id %> для создания уникального идентификатора для каждой вложенной таблицы, поэтому я могу использовать целевую информацию.

Он отлично работает для первого гнездования (много фаз в этюда), однако я не могу поместить Аффекты на фазах в теле. He're моя ода

_phases.html.erb

<%= nested_form_for @etude, :method => :post, :remote => true do |f| %> 
<table class="table table-striped table-bordered table-hover" id="tableau_phases"> 
    <thead> 
     blablabla 
    </thead> 

    <tbody> 
     <%= f.fields_for :phases, :wrapper => false %> 
    </tbody> 
</table> 

<!-- I use an other table tag otherwise new entries would appear after the "add_phase" link --> 
<table class="table table-striped table-bordered table-hover"> 
    <tr><td> 
     <%= f.link_to_add t("add_phase"), :phases, :data => { :target => "#tableau_phases" } %> 
    </tr></td> 
</table> 
<% end %> 

_phase_fields.html.erb

<tr> 
    My fields 
</tr> 
<tr> 
    <td colspan="5"> 
    <table id="<%= f.object.id %>" class="table table-striped table-bordered table-hover liste-intervenants"> 
     <thead> 
      stuff 
     </thead> 
     <tbody><% f.fields_for :affectations %></tbody> 
    </table> 
    </td> 
</tr> 
<tr> 
    <td colspan="5"> 
     <%= f.link_to_add "Ajouter un intervenant", :affectations, :data => { :target => "##{f.object.id}"} %> 
    </td> 
</tr> 

_affectation_fields.html.erb

Просто некоторые довольно простые <tr><td></td></tr> материала

Проблема:

После нажатия на ссылку, чтобы добавить новую аффектацию, он не ставит вещи в оном столе, но и создает дополнительный DIV. He're, что это выглядит как в DOM

<table id="8354u3r1jh534g2fh"> 
    <thead>headers</thead> 
    <tbody>EMPTY !!!</tbody> 
    <div class="fields"> Stuff is added there and not in the tbody !</div> 
</table> 

Это странно, потому что я действительно есть :data => { :target => "##{f.object.id}"}, который должен обрабатывать вставки даты в TBODY (я проверил, и этот код на самом деле выдает хорошую вещь)

Примечание: Это работает отлично для первого уровня вложенности форм (: фазы в @etude)

ответ

0

Я установил ее, наряду с другими проблемами, которые я нашел на пути:

FIX для первоначального вопроса: Я забыл :wrapper => false для второго уровня вложенности форм

_phase_fields.html.erb

<tr> 
    <td colspan="5"> 
    <table id="<%= f.object.id %>" class="table table-striped table-bordered table-hover liste-intervenants"> 
     <thead> 
      stuff 
     </thead> 
     <tbody><% f.fields_for :affectations, :wrapper => false %></tbody> 
    </table> 
    </td> 
</tr> 

ПРОБЛЕМА 2: Я до сих пор странные вещи происходят. Например, когда у меня есть это на моем веб-интерфейсе

Etude 
    Phase 1 
    [nothing] 
    Phase 2 
    [>> I Click "link_to_add" to add a new nested child "Intervenant 2.1"] 

тогда результат становится

Etude 
    Phase 1 
    [Intervenant 2.1] 
    Phase 2 
    [nothing] 

Соответствующий фрагмент кода в _phase_fields.html.Эрба

<%= f.link_to_add "Ajouter un intervenant", :affectations, :data => { :target => "##{f.object.id}"} %> 

Теперь, казалось бы "##{f.object.id}" остается неизменным, даже для различных «вложенной ребенка». Это на самом деле ошибка из драгоценного камня?

FIX для задачи 2

На самом деле, поколение ID должно быть сделано с помощью f.index, как это было предложено rails API.

ПРОБЛЕМА 3

вложенная вложенной форма не создают хорошие элементы ID для динамически добавляемых полей!

_affectation_fields.html.erb

==><%= f.xxxx %> будет генерировать что-то вроде etude[phases_attributes][new_phases][affectations_attributes][1415653508668][nb_jeh]. Проблема заключается в [new_phase], который не заменяется соответствующим генерироваться фазы ID

FIX для задачи 3

в каждой частичной, либо обернуть <tr> внутри <tbody class="fields"> или, если есть один <tr>, добавьте .fields класс это

Объяснение: вложенности форм полагается много на драгоценный камень nested_form регулярных выражений матча & заменить Javascript. И the code использует функции jquery, которые найдут элементы DOM, прежде всего, перейдя к ближайшему предшественнику .fields. Например: link_to_remove перейдет к ближайшему .fields, спрячьте его, а также установите для _destroy значение true.

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