2016-07-21 15 views
0

der relevante Teil der neuen Form wie folgt aussieht:erstes Element in einem Array aus der multiplen collection_select ist immer leer

<%= f.fields_for :event_artists do |fea| %> 
    <%= fea.collection_select :artist_id, Artist.all, "id", "name", {include_blank: true}, {multiple: true} %> 
    <% end %> 

auf dem Protokoll, können Sie das erste Element des Arrays sehen, dass immer leer ist, auch wenn ich nicht das leere Feld gewählt habe

"event_artists_attributes"=>{"0"=>{"artist_id"=>["", "2", "5"]}}} 

gibt es eine Möglichkeit, das zu beheben? vielleicht, machen Sie es so, dass, wenn das leere Feld ausgewählt ist, dann keine tatsächlichen event_artists in diesem Fall ausgewählt werden können, und umgekehrt?

Antwort

0

Der leere artist_id ist wichtig. In einem anderen Formular haben Sie möglicherweise die Auswahl des Künstlers komplett weggelassen. In diesem Fall sollte die artists Assoziation nicht beeinflusst werden.

Wenn der Künstler ausgewählt ist und Sie alle Künstler deaktivieren, müssen die Künstler aus der artists Assoziation entfernt werden. Normales HTML-Verhalten würde den Parameter artist_id im PUT überhaupt nicht enthalten, wenn nichts ausgewählt ist. Ihr Controller würde in diesem Fall denken, dass Sie die Zuordnung artists überhaupt nicht ändern möchten.

Um dies zu lösen, enthält die collection_select ein verstecktes Feld mit einem leeren Wert, um den Controller wissen zu lassen, dass das Formular beabsichtigt, die artists Zuordnung zu ändern. Wenn keine Künstler ausgewählt wurden, stellt dieses leere Element im Array sicher, dass alle Künstler aus der Assoziation entfernt werden.

+0

Also, um es zusammenzufassen, das ist normal und es gibt nichts zu beheben? – sivanes

+0

Ja, das ist die Zusammenfassung. –

+0

aufschlussreich, danke! – sivanes

0

Ich denke, das Problem hat mit der Reihenfolge der Argumente zu tun. Ich schaute auf collection_select und versuchte den folgenden Code in einer App, an der ich arbeite.

<%= collection_select(:category, :category_id, Category.all, :id, :name, {}, {multiple: true}) %> 

UPDATE:

<%= fea.collection_select :artist_id, Artist.all, "id", "name", {prompt: true}, {multiple: true} %> 
+0

Einstellung auf false hat nichts geändert, immer noch das erste Element ist leer – sivanes

+0

Ich bearbeitete meine Antwort oben –

+0

Ich glaube nicht, dass es das ist. Das Argument ': artist' sollte nicht benötigt werden, da die Zeile' f.fields_for: event_artists do | fea | 'das übernehmen sollte. und ich möchte ein Bankfeld haben, also brauche ich das in den ersten geschweiften Klammern. – sivanes