Rails 3: nested_form, collection_select, accept_nested_attributes_for и fields_for

Обновление: ответ здесь .

Здесь и в сети есть много хороших вопросов и ответов о том, как получить nested_form, collection_select, accept_nested_attributes_for и fields_for, чтобы хорошо играть вместе, но я все еще в тупике. Заранее спасибо, если вы можете мне помочь.

Цель: создать новую запись isbn. ISBN может иметь много участников. Я успешно использую гем ryanb nested_form для динамического создания новых полей участников в форме по мере необходимости. В одном из этих полей используется раскрывающийся список collection_select для всех записей имен в Contributor. Когда создается новая запись, многие идентификаторы участников должны быть записаны в объединенную таблицу (Contributors_isbns).

У меня есть фрагменты этой работы, но только до такой степени, что я могу сохранить один идентификатор участника в новом запись в таблице isbns. Кажется, я никуда не денусь при записи каких-либо данных в таблицу соединений.

У меня три модели. У авторов и Isbns есть отношения "многие ко многим", что я сделал с помощью has_many: through. ISBN может иметь много участников, а участник может иметь много ISBN. К ним присоединяются через 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| %>

Create new ISBN

<%= render 'shared/error_messages', :object => f.object %> <%= render 'fields', :f => f %>
<%= f.submit "Create" %>
<% end %>

В партиале _fields - версия с очень простым text_field:

<%= field_set_tag 'Contributor' do %>
<%= f.link_to_add "Add Additional Contributor", :contributors %>
  • <%= f.label 'Contributor Sequence Number' %> <%= f.text_field :descriptivedetail_contributor_sequencenumber%>
  • <%= f.fields_for :contributors_isbns, :validate => false do |contrib| %>
  • <%= contrib.label :id, 'contributors_isbns id' %> <%= contrib.text_field :id %>
  • <% end %>
  • <%= f.label 'Contributor Role' %> <%= f.text_field :descriptivedetail_contributor_contributorrole %>
  • <% end %>

    А здесь более изящная версия, которая тоже не работает:

    <%= f.fields_for :contributors_isbns, :validate => false do |contributors| %>
    
  • <%= f.label :personnameinverted, 'Contributor Name' %> <%= f.collection_select(:contributor_id, Contributor.all, :id, :personnameinverted ) %>
  • <% end %>

    В этом коде используется ответ из здесь . Оба приводят к ошибке «Отсутствует блок» в строке nested_form_for @isbn .

    Еще раз большое спасибо.

    Обновление: здесь некоторая информация о вложенной_форме драгоценный камень, который может пригодиться при рассмотрении такого рода проблем.А вот [2009, но все еще актуальный пост] [4] о accept_nested_attributes_for.

    Обновление 2: вот в чем дело. Я искал урезанную версию этого в двух разных моделях, не используя collection_select или has_many through, а просто используя простую ассоциацию own_to / has_many. Родительской моделью является Contract, а дочерней моделью - Istc. Я даже не мог создать запись через вложенную форму. Однако после просмотра стека и поиска в Google сообщения об ошибке «Предупреждение. Не удается массово назначить защищенные атрибуты» я только что добавил : istcs_attributes в свою строку : attr_accessible и теперь Могу добавлять записи. Отсутствует довольно важный бит и случай RTFM, поскольку он прямо там в файле readme для драгоценного камня. Я обновлю позже, чтобы увидеть, работает ли это с более сложным has_many через ассоциацию.

    Обновление 4: [Здесь] [5] - еще один полезный пост о том, как бороться с сообщением об ошибке нулевой записи.

    Обновление 5: Незначительный обход - когда я динамически добавлял в форму новый набор полей, создавалась одна из дочерних записей. Да, у меня была ссылка «Добавить» внутри области дочерних форм. Вот до:

    <%= f.fields_for :istcs do |istc_form| %>
    

    Istc

    <%= 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| %>
    

    Istc

    <%= 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, пост-ответ:

    О нет. Collection_select не работает. Он добавляет новые записи об участнике, а не использует существующую из модели участника. У кого-то еще была эта проблема. Есть идеи?

    6
    задан Community 23 May 2017 в 12:06
    поделиться