рельсы, как сделать f.parent.text_field: имя

Мне нужно поместить поля из журналов и journal_entries в одну строку таблицы и иметь возможность добавлять и отображать множество строк ввода данных в одном и том же представлении. (т.е. таблица строк и использование link_to_add_fields с accepts_nested_attributes для расширения строк в таблице).

Должно быть какое-то f.parent.text_field или f.object.parent.text_field?

Я пытаюсь сделать что-то вроде следующего

<table>
#in a :pm namespace
<%= form_for [:pm, @lease] do |f| %>
  <%= f.fields_for :journal_entries do |journal_entries| %>
    <%= render "journal_entry_fields" , f: journal_entries %>
  <% end %>
  <%= link_to_add_fields "+ Add transactions", f, :journal_entries %>
<% end %>
</table>

_journal_entry_fields.html.erb

<fieldset>
  <tr>
    ## HERE IS WHAT I'M LOOKING FOR <<<<<<<<<<<!!>>>>>>>>>>>>>
    <td><%= f.parent.text_field :dated %></td>
    <td><%= f.parent.text_field :account_name %></td>
    <td><%= f.text_field :credit %></td>
    <td><%= f.text_field :notes %></td>        
  </tr>
</fieldset>

Мои модели

class Lease < ActiveRecord::Base
  has_many :journals, :order => [:dated, :id] #, :conditions => "journals.lease_id = id"
  has_many :journal_entries, :through => :journals  
  accepts_nested_attributes_for :journal_entries , :allow_destroy => true
  accepts_nested_attributes_for :journals ,  :allow_destroy => true    
end

class Journal < ActiveRecord::Base
  belongs_to :lease, :conditions =>  :lease_id != nil   
  has_many :journal_entries
  accepts_nested_attributes_for :journal_entries , :allow_destroy => true
end

class JournalEntry < ActiveRecord::Base
  belongs_to :journal
end

Я использую Rails 3.2.12 и ruby ​​1.9.3.

Я пытаюсь понять, является ли это лучшим решением, чем проблема, с которой столкнулись: rails link_to_add_fields не добавляет поля с has_many :through (с вложенной формой внутри)

Я создал другую тему, потому что я думаю, что она сильно отличается.

Спасибо, Фил


person nevieandphil    schedule 13.03.2013    source источник
comment
Можете ли вы подробнее рассказать о том, чего вы хотите достичь? Почему вы снова добавляете <%= f.fields_for :journal_entries do |g| %> в _journal_entry_fields.html.erb?   -  person Manoj Monga    schedule 13.03.2013
comment
Каково назначение поля dated? Почему вы пытаетесь назначить его из формы ассоциации? Что произойдет, если два разных journal_entries будут иметь два разных значения для родительского dated? Мне мало смысла...   -  person HargrimmTheBleak    schedule 13.03.2013
comment
Исправлено, его там не должно было быть :) Хороший улов, Манодж. Я пытаюсь сделать так, чтобы входные данные из модели журнала и модели журнала_входа помещались в одно и то же пространство. Я знаю, что это может привести к путанице родителя, если вы попытаетесь изменить его, когда есть несколько дочерних элементов, но этого можно избежать, отключив родитель, когда у него более одного дочернего элемента (позволив ему редактировать родителя только первого или последнего дочернего элемента). ... Тем не менее, возможно ли сделать какой-то атрибут f.parent.text_field :attribute?   -  person nevieandphil    schedule 13.03.2013
comment
Вы хотите создавать журналы и их записи при создании аренды? Тогда вам нужно использовать двухуровневую глубокую вложенность. Кажется, у вас это уже есть, но вам нужно добавить это в файлы просмотра. Лексус знает, правильно ли я понимаю.   -  person Manoj Monga    schedule 13.03.2013
comment
Да, пока я создаю/обновляю аренду, я хочу иметь возможность создавать/редактировать журналы и журнальные записи для этой аренды. Я попытаюсь разделить их, а не объединять, это, вероятно, будет более подходящим для данных. Но если есть ленивый способ сделать это, я бы не возражал :)   -  person nevieandphil    schedule 13.03.2013


Ответы (2)


Насколько я понимаю ваш вариант использования, вы хотите создавать журналы и их записи в единой форме аренды. Итак, вы можете использовать fields_for для них обоих, как показано ниже:

<table>
  #in a :pm namespace
  <%= form_for [:pm, @lease] do |f| %>
    <%= f.fields_for :journals do |journal| %>
      <%= render "journal_entry_fields" , f: journal %>
    <% end %>
  <%= link_to_add_fields "+ Add transactions", f, :journals %>
 <% end %>
</table>

_journal_entry_fields.html.erb

<fieldset>
  <tr>
    <td><%= f.text_field :dated %></td>
    <td><%= f.text_field :account_name %></td>
    <%= f.fields_for :journal_entries do |journal_entry| %>
      <td><%= journal_entry.text_field :credit %></td>
      <td><%= journal_entry.text_field :notes %></td>
    <% end %>   
  </tr>
</fieldset>

Хотя вам необходимо инициализировать записи журнала каждый раз, когда новая запись добавляется динамически. Я не могу помочь вам с этим прямо сейчас, так как я не на своем компьютере.

person Manoj Monga    schedule 13.03.2013
comment
Это не то решение, которое я надеялся получить, но, вероятно, лучше всего убить там кошку. f.parent может вызвать конфликты, если пользователь попытается изменить одну родительскую запись, а дочерних записей было несколько. Единственная проблема здесь заключается в том, что если в журнале много записей, он будет уходить вправо (делая уродливую таблицу). Было бы лучше, если бы был более простой способ сделать много строк для journal_entries. Мое решение похоже на это, за исключением того, что я прибегаю к div (и плавающим), а не к простой таблице. Спасибо Маной! - person nevieandphil; 14.03.2013
comment
Да, я действительно хотел предложить вам то же самое. Кстати, пожалуйста! :) - person Manoj Monga; 14.03.2013
comment
Теперь мне просто нужно выяснить, как инициализировать эту запись журнала каждый раз, когда добавляется запись. Я думал это будет делаться с контроллера @lease = Lease.new; journal = @lease.journals.build; journal.journal_entries.build - person nevieandphil; 14.03.2013
comment
Нет, часть контроллера выполняется, как только отображается страница просмотра. Итак, теперь дело за помощниками или просмотром файла, как с этим справиться. Я думаю, вы можете попробовать этот гем для обработки динамического добавления вложенных полей. И для инициализации journal_entry вы можете проверить, инициализирован ли он уже, или инициализировать его как journal_ent = journal.object.journal_enteries.build journal.object.journal_enteries.blank? в частичном. - person Manoj Monga; 14.03.2013

Попробуйте это: http://railscasts.com/episodes/196-nested-model-form-revised

Отношения модели RailsCasts аналогичны отношениям вашей модели, хотя вам нужно будет изменить HTML.

Модели RailsCasts: Survey > Question > Answer

Ваши модели: Lease > Journal > JournalEntry

person Sam    schedule 13.03.2013
comment
Да, я использовал именно этот эпизод для многих вещей, которые у меня есть, но в этом случае он не работает. У меня работают другие модели, но в этом случае волшебство не работает. Есть идеи по поводу f.parent? - person nevieandphil; 13.03.2013
comment
Я не могу придумать, как поступить по-родительски. Вместо этого я бы попытался вложить модели в 2 глубины. - person Sam; 13.03.2013
comment
Да, это, вероятно, [безусловно] наиболее подходящий способ, просто кажется, что язык должен поддерживать то, что я пытаюсь сделать [даже если это немного неуместно]. Спасибо Сэм - person nevieandphil; 13.03.2013