Rails-Formulare für has_many durch Verknüpfung mit zusätzlichen Attributen?

8

Wie kann ich Formularfelder für eine has_many :through Assoziation erzeugen, die zusätzliche Attribute hat?

Die Beziehung has_many :through hat eine zusätzliche Spalte namens weight .

Hier ist die Migrationsdatei für die Join-Tabelle:

%Vor%

Die Modelle sehen so aus:

%Vor%

Aus Gründen der Einfachheit haben Widget und Benutzer nur ein eigenes Feld namens name , ergo User.first.name und Widget.first.name

Fragen:

  • Wie würde ich eine Dropdown-Auswahl für Widgets mit dem entsprechenden Gewicht an das Formular zum Erstellen / Bearbeiten von Benutzern anhängen?

  • Wie kann ich dynamisch zusätzliche Widget-Formulare zu Benutzern oder Benutzerformularen zu Widgets hinzufügen, um diese Beziehungen einfach hinzuzufügen oder zu entfernen? Das nested_form_for Juwel scheint die perfekte Lösung zu sein, aber ich konnte es nicht zum Laufen bringen.

  • Gibt es außer den Modellen und den Formteil-Teilbereichen irgendwelche Änderungen, die an meinem Controller vorgenommen werden müssen?

Schneller Hinweis .. Ich bin nicht daran interessiert, neue Widgets im Benutzerformular oder neue Benutzer im Widget-Formular zu erstellen. Ich möchte nur die Möglichkeit haben, aus vorhandenen Objekten auszuwählen.

Ich verwende Rails 3.1 und simple_form 2.0.0dev zum Generieren meiner Formulare.

    
Marco 02.12.2011, 07:20
quelle

3 Antworten

6

Ich werde Ihr Problem mit cocoon lösen, einem Juwel, das ich zur Bearbeitung von verschachtelten Formularen erstellt habe. Ich habe auch ein Beispielprojekt , um Beispiele für verschiedene Arten von Beziehungen zu zeigen.

Ihr ist nicht buchstäblich enthalten, aber es ist nicht so schwer daraus abzuleiten. In Ihrem Modell sollten Sie schreiben:

%Vor%

Dann müssen Sie eine Teilansicht erstellen, die Ihre verknüpfte UserWidgets auflistet. Platzieren Sie dieses Partial in einer Datei namens users/_user_widget_fields.html.haml :

%Vor%

In Ihrem users/edit.html.haml können Sie dann schreiben:

%Vor%

Hoffe, das hilft.

    
nathanvda 17.12.2011, 10:04
quelle
6

begründe deine Frage. Ich habe eine einfache App gemacht. Quelle ist hier: Ссылка Ich habe es auf Heroku eingesetzt, Sie können Seite öffnen: Ссылка

Antworten

  1. Sie wollen Benutzerformular kann Widget mit Gewicht auswählen, muss mehr Arbeit zu tun.dropdown Auswahl kann Ihre Anforderung nicht erfüllen.

  2. Ich mische "nested_form" in einem "bootstrap-rails" -Plugin, Sie können die nested_fields einfacher hinzufügen

  3. In meinem Beispiel müssen Sie eine Aktion hinzufügen, wählen Sie aus, und machen Sie WidgetsController # create kann responsed_with: js

Der Code basiert simple_form, Sie können es versuchen.

    
blade 13.12.2011 09:54
quelle
0

Vielen Dank für den Kokonzeiger nathanvda. Ich habe mir über einige Probleme gekratzt, die ich hatte, als ich versuchte, dies unter Rails 4.0.0-rc1 zu implementieren, und ich dachte, ich würde meine Ergebnisse teilen, nur für den Fall, dass jemand die gleichen Probleme bei diesem Versuch hat.

Unter Verwendung des obigen Codes als Beispiel habe ich user_id und widget_id zu den erlaubten Parametern hinzugefügt, wie sie in der Verbindungstabelle user_widgets gespeichert sind. In Rails 3 musst du sie zu attr_accesible im Benutzermodell hinzufügen, aber in Rails 4 musst du sie zu den erlaubten Parametern im Controller des Hauptmodells hinzufügen, das du für die Verschachtelung verwendest, also hier wäre der users_controller:

%Vor%

Wenn Sie nur dies tun, haben Sie mehrere Probleme:

  1. Jede Verknüpfung (Widget) wird beim Aktualisieren eines Benutzerdatensatzes multipliziert. 1 wird 2, 4, 8 usw. beim Aktualisieren und Speichern des Datensatzes.
  2. das Entfernen einer Assoziation funktioniert nicht, das Feld wird aus dem Formular entfernt, aber die Assoziation verbleibt in der Datenbank.

Um diese Probleme zu beheben, müssen Sie außerdem: id und: _destroy zur Liste der erlaubten Attribute hinzufügen:

%Vor%

danach funktioniert es einwandfrei.

Jürgen

PS: Im Moment musst du das Git-Repository in deiner Gemfile verwenden, um Kokon unter Schienen 4 zu verwenden, bis ein mit Rails 4 kompatibles Juwel veröffentlicht wird. Danke für die Email nathanvda auf meinem Fehlerbericht !!

    
helmerj 06.06.2013 07:55
quelle