_fields.html.erb
Здесь и на веб-сайте есть много хороших вопросов и ответов о том, как заставить nested_form, collection_select, accepts_nested_attributes_for и fields_for хорошо играть вместе, но я все еще в замешательстве. Спасибо заранее, если вы можете мне помочь.
Цель: создать новую запись isbn. Isbn может иметь много участников. Я успешно используюryanb nested_form gem динамически создавать новые поля участника в форме, как требуется. В одном из этих полей используется раскрывающийся список collection_select всех записей имен в Contributor. Когда создается новая запись, многие идентификаторы участников должны быть записаны в таблицу соединений (contributors_isbns).
У меня есть кое-что из этой работы, но только до такой степени, что я могу сохранить один идентификатор участника в новую запись в таблице isbns. Кажется, я нигде не могу записать какие-либо данные в таблицу соединений.
У меня есть три модели. Участники и Isbns имеют отношения многие ко многим, что я сделал с помощью has_many: through. У isbn может быть много участников, а у участника может быть много isbns. Они присоединяются через contributors_isbn.
isbn.rb
attr_accessible :contributor_id
has_many :contributors, :through => :contributors_isbns
has_many :contributors_isbns
accepts_nested_attributes_for :contributors
accepts_nested_attributes_for :contributors_isbns
contributor.rb
attr_accessible :isbn_id
has_many :contributors_isbns
has_many :isbns, :through => :contributors_isbns
accepts_nested_attributes_for :isbns
contributors_isbn.rb
class ContributorsIsbn
attr_accessible :isbn_id, :contributor_id
belongs_to :isbn
belongs_to :contributor
accepts_nested_attributes_for :contributors
В контроллере isbns:
def new
@isbn = Isbn.new
@title = "Create new ISBN"
1.times {@isbn.contributors.build}
@isbn.contributors_isbns.build.build_contributor
end
(очевидно, я не могу решить, какой метод сборки использовать.)
В представлении isbns new.html.erb:
<%= nested_form_for @isbn, :validate => false do |f| %>
<h1>Create new ISBN</h1>
<%= render 'shared/error_messages', :object => f.object %>
<%= render 'fields', :f => f %>
<div class="actions">
<%= f.submit "Create" %>
</div>
<% end %>
В части _fields, версия с очень простым text_field:
<%= field_set_tag 'Contributor' do %>
<%= f.link_to_add "Add Additional Contributor", :contributors %>
<li>
<%= f.label 'Contributor Sequence Number' %>
<%= f.text_field :descriptivedetail_contributor_sequencenumber%>
</li>
<%= f.fields_for :contributors_isbns, :validate => false do |contrib| %>
<li>
<%= contrib.label :id, 'contributors_isbns id' %>
<%= contrib.text_field :id %>
</li>
<% end %>
<li>
<%= f.label 'Contributor Role' %>
<%= f.text_field :descriptivedetail_contributor_contributorrole %>
</li>
<% end %>
И вот, причудливая версия, которая тоже не работает:
<%= f.fields_for :contributors_isbns, :validate => false do |contributors| %>
<li>
<%= f.label :personnameinverted, 'Contributor Name' %>
<%= f.collection_select(:contributor_id, Contributor.all, :id, :personnameinverted ) %>
</li>
<% end %>
Этот код использует ответ отВот, Оба результата приводят к ошибке «Отсутствует блок» наnested_form_for @isbn
линия.
Еще раз большое спасибо заранее.
Обновить:Вот некоторая информация о геме nested_form, которая может пригодиться при рассмотрении такого рода проблем. А вот [2009, но все еще актуальный пост] [4] на acceptpts_nested_attributes_for.
Обновление 2: ну, вот в чем дело. Я искал урезанную версию этого в двух разных моделях, не используя с помощью collection_select или has_many, а просто с простой ассоциацией own_to / has_many. Родительская модель - Контракт, а дочерняя модель - Istc. Я даже не мог создать запись через вложенную форму. Тем не менее, после просмотра в стеке и поиска в Google сообщение об ошибке «Предупреждение. Невозможно массово назначить защищенные атрибуты»:istcs_attributes
к моему:attr_accessible
линия и теперь я могу добавлять записи. Довольно важный бит отсутствует, и случай RTFM, как это прямо там, в gem readme. Я обновлю позже, чтобы увидеть, работает ли это на более сложной ассоциации has_many.
Обновление 4: [Здесь] [5] - еще один полезный пост о том, как бороться с сообщением об ошибке с нулевой записью.
Обновление 5: Небольшой обход. Когда я динамически добавлял в форму новый набор полей, создавалась одна из дочерних записей. Да, у меня была ссылка "Добавить" в области дочерних форм. Вот прежде:
<%= f.fields_for :istcs do |istc_form| %>
<h4> Istc</h4>
<%= istc_form.label "istc name" %>
<%= istc_form.text_field :title_title_text %>
<%= istc_form.link_to_remove "[-] Remove this istc"%>
<%= f.link_to_add "[+] Add an istc", :istcs %>
<% end %>
и вот после:
<%= f.fields_for :istcs do |istc_form| %>
<h4> Istc</h4>
<%= istc_form.label "istc name" %>
<%= istc_form.text_field :title_title_text %>
<%= istc_form.link_to_remove "[-] Remove this istc"%>
<% end %>
<%= f.link_to_add "[+] Add an istc", :istcs %>
Обновление 6, пост-ответ:
О нет. Коллекция_выбор не работает. Он добавляет новые записи участника, а не использует существующую из модели участника.Кто-то еще была эта проблема тоже. Есть идеи?