Sichtlich verschachtelte Rails-Formulare, die belong_to verwenden, funktionieren nicht?

Ich arbeite an einem chaotischen Formular, das unter anderem einen Abschnitt mit zweistufiger Verschachtelung verwalten muss. Es funktioniert fast, aber es gibt einen Haken, und das Einzige, was ich sehen kann, das sich von anderen tief verschachtelten Formen unterscheidet, ist, dass es eine Beziehung gibt, die eher zur Beziehung gehört als zu vielen. Hier sind die Modelle:

Event
  has_many :company_events, :dependent => :destroy
  accepts_nested_attributes_for :company_events

CompanyEvent
  belongs_to :company
  accepts_nested_attributes_for :company, :update_only => true
  belongs_to :event
  belongs_to :event_type

Company
  has_many :company_events
  has_many :events, :through => :company_events

So ist es eine ziemlich normale Viele-zu-Viele-Beziehung über eine Verknüpfungstabelle, company_events. Das fragliche Formular erstellt / bearbeitet eine Veranstaltung mit einer dynamischen "Add Company" -Javascript-Schaltfläche, die alle auf Ryan Bates Screencast und GitHub Repo basiert.

Das Hauptformular:

<table id="companies">
  <tr><th>Company Name</th></tr>
  <% f.fields_for :company_events do |builder| %>
    <%= render 'company_event_fields', :f => builder, :f_o => nil %>
  <% end -%>
</table>
<p><br/><%= link_to_add_fields "Add Company", f, :company_events, "events" %></p>

Und das beigefügte Formular sieht wie folgt aus. Ein wichtiger Punkt ist, dass die Firmen-ID über ein Javascript-Update festgelegt wird, das ich hier nicht erwähnen werde, weil es lang ist. Grundsätzlich beginnt der Benutzer mit der Eingabe eines Namens, es wird eine Autovervollständigungsliste angezeigt, und durch Klicken auf den Namen werden sowohl der Firmenname als auch die ID im Formular festgelegt.

<tr class="company_event_fields">
  <td>
    <% f.fields_for(:company) do |company_form| -%>
      <%= company_form.text_field :name, :size => 80 %>
      <%= company_form.hidden_field :id %>
    <% end -%>
  </td>
  <td>
    <%= f.hidden_field :_destroy %>
    <%= link_to_function "remove", "remove_co_fields(this)" %>
  </td>
</tr>

Wenn ich einen vorhandenen Datensatz aktualisiere, funktioniert alles einwandfrei. Wenn ich versuche, das Formular mit einem neu erstellten Datensatz zu speichern, erhalte ich jedoch Folgendes:

ActiveRecord::RecordNotFound in EventsController#update

Couldn't find Company with ID=12345 for CompanyEvent with ID=

Mit dem Stacktrace:

/Library/Ruby/Gems/1.8/gems/activerecord-2.3.8/lib/active_record/nested_attributes.rb:401:in `raise_nested_attributes_record_not_found'
/Library/Ruby/Gems/1.8/gems/activerecord-2.3.8/lib/active_record/nested_attributes.rb:289:in `assign_nested_attributes_for_one_to_one_association'
/Library/Ruby/Gems/1.8/gems/activerecord-2.3.8/lib/active_record/nested_attributes.rb:244:in `company_attributes='
/Library/Ruby/Gems/1.8/gems/activerecord-2.3.8/lib/active_record/base.rb:2906:in `send'

Ich habe den Code in nested_attributes durchgesehen und ihn mit einem Debugger ausgeführt. Da es eine Company.id gibt, geht ActiveRecord anscheinend davon aus, dass bereits ein Eintrag vorhanden ist, findet dann aber natürlich keinen. Dies scheint sehr seltsam, da ich offensichtlich eine ID übergeben muss, um einen neuen CompanyEvent-Eintrag zu erstellen. Also vermute ich, dass mir etwas fehlt.

Die Beispiele, die ich gefunden habe, zeigen, dass die gesamte Arbeit mit has_many-Beziehungen verschachtelt zu sein scheint. In diesem Fall handelt es sich um ein Gehör und ich frage mich, ob das die Wurzel des Problems ist. Irgendwelche Ideen wäre sehr dankbar ...

Antworten auf die Frage(4)

Ihre Antwort auf die Frage