2013-03-08 5 views
1

в моемRails построить fields_for однажды внутри fields_for

<%= nested_form_for @object do |f| %> 

У меня есть nested_form как:

<%=f.fields_for :nested, :url => { :action => "new" } do |build| %> 
    <%= render 'nested_fields', :f => build %> 
<% end %> 

и внутри этой nested_field, у меня есть еще один fields_for: nested2

Моя проблема is: Я хочу, чтобы nested2 появлялся 1 раз, когда вызывается вложенный. Я пытался в новом действии вложенной контроллеру

@nested = Nested.new 
@nested.nested2.build 

, но это работает только для «реального» нового действия. Есть ли какое-либо решение этой проблемы?

Я использую драгоценный камень «nested_form».

+0

У меня возникли проблемы с пониманием того, что вы просите. Вы пытаетесь создать форму для вашего 'obkect' (typo?), Которая затем имеет в нем новый« вложенный »объект, причем этот« вложенный »объект также имеет вложенную форму для нового« вложенного2 »? Кроме того, что с ': url => {: action =>" new "}' в вашем вызове 'fields_for'? –

+0

Да, вы правы - это была просто опечатка. Я исправил это сейчас. Форма предназначена для объекта и имеет внутри себя внутри. Это вложенное может быть добавлено так часто, как я нажимаю на ссылку. Например: у меня есть счет с таким количеством статей, сколько я хочу. Чтобы объединить их, я использую отдельную таблицу с invoice_id и article_id, а также количество статей. Теперь, когда я хочу добавить новый счет с новыми статьями, мне нужно заполнить поле «count» в отдельной таблице. Надеюсь, теперь немного яснее, что я пытаюсь сделать? – Adrian

ответ

3

fields_for позволяет указать конкретный объект для визуализации поля для, так что если вы хотите, чтобы ваши nested_fields парциальных содержать вложенные поля для одного, вновь построить nested2 модели, вы можете сделать это в самом fields_for вызова, как это:

# '_nested_fields.html.erb' 

... 
<%= f.fields_for :nested2, f.object.build_nested2 do |build| %> 
    <%= ... %> 
<% end %> 

Это предполагает, что Nestedhas_one :nested2, если это has_many объединение в fields_for аргументы будут немного отличаться:

<%= f.fields_for :nested2s, f.object.nested2s.build do |build| %> 

f.object позволяет получить доступ к объекту построителя форм, а затем вы можете использовать его методы ассоциации (на основе типа ассоциации) для создания нового объекта в этой точке.

+0

В моем случае это ассоциация has_many. Что мне нужно изменить в этом аргументе? – Adrian

+0

Я обновил свои ответы, чтобы охватить любую ситуацию. Из вашего описания выше, хотя, я не совсем понимаю, зачем вам нужна ассоциация has_many (хотя я думаю, что все еще не хватает чего-то, чего вы пытаетесь достичь). –

+0

Это почти точно ситуация выше, которую я пытаюсь понять. У меня есть счета-фактуры, статьи и «invoice_articles». У последнего есть отношения «принадлежит» и первые два имеют ассоциации «has_many: through». Ваше измененное решение вызывает следующее исключение: undefined method 'invoice_articles ' – Adrian