Wie implementiere ich remote: echte Funktionalität ohne link_to?

9

Ich versuche geschachtelte Modelle zu implementieren, hier ist der route-Dateieintrag:

%Vor%

Nachfolgend ist das Snippet für den Projektcontroller:

%Vor%

und die Formularansicht des Projekts:

%Vor%

Wenn ich jetzt die Anzahl der Instanzenanzahl ändere, muss ich die Instanzfelder so oft unter dem obigen Formular anzeigen. Hier ist der Teilcode dafür:

%Vor%

Grundsätzlich muss ich <%= render 'instances/form', form: f %> aus der JavaScript-Datei des Projekts aufrufen. Es sollte funktionieren wie Link mit remote: true Option. Aber in diesem Fall gibt es keine Verknüpfung, aber beim Änderungsereignis muss das Formular angezeigt werden. Wie soll ich das umsetzen?

    
Raj Mishra 13.10.2017, 15:47
quelle

5 Antworten

0

Sie müssen den serverseitigen Code einmal aufrufen, da instances/form Code enthält, der nur serverseitig gerendert werden kann.
Zuerst müssen Sie einen Ajax-Aufruf ausführen (zB instance_new_path) und dann müssen Sie das Formular in dieser Ansicht rendern ( instance_new.js.erb ).

Beispiel .js.erb

%Vor%     
My Favorite Bear 13.10.2017 15:56
quelle
0

Standard ist ein partieller Aufruf von app/views/instances/_instance_fields.html.erb . Dann können Sie es einfach in Ihr Formular laden und es ausblenden.

%Vor%

Cover _instance_fields partially mit einer Art Container, wie <fieldset class='instance_fields' style='display:none'> . Außerdem sollten Sie dort kein Formularobjekt verwenden, gehen Sie einfach mit den Eingaben text_field_tag ​​/ checkbox_tag dahin. Wenn Sie dann weitere Instanzen hinzufügen müssen, kopieren Sie diese ausgeblendeten Snippets einfach so oft wie nötig und richten Sie die richtigen Namen für die Eingaben ein (um für accepts_nested_attributes_for zu übernehmen).

Ping mich, um mehr Details und Hilfe zur Verfügung zu stellen. Dies ist ein Ansatz, der im realen Projekt verwendet wurde. Fire Ajax Call jedes Mal, wenn Sie mehr Instanzen hinzufügen müssen, ist überhaupt nicht optimiert.

    
AntonTkachov 13.10.2017 16:24
quelle
0

Ich empfehle Ihnen, Ссылка

zu verwenden

Oder Sie können einen ähnlichen Ansatz verwenden: Teilweise in der ursprünglichen Form rendern (mit display: none), dann Teilfelder mit js entfernen und speichern und sie klonen, wenn Selektor getroffen wird.

    
kolas 13.10.2017 17:13
quelle
0

Erstellen Sie eine .js -Datei, und laden Sie sie in projects/new.html.erb , was immer dann ausgeführt wird, wenn eine Änderung in select -Wert stattfindet und eine post -Anforderung an instances/new -Controller erstellt, die instances/new.js.erb alle rendert Zeit es geschlagen wird.

%Vor%

Instanzen / new.js.erb

%Vor%

laden.js

%Vor%

Obwohl Sie nicht so verwenden sollten. Lade stattdessen ein instance -Feld bereits in deinem Code, behalte es versteckt, da du instance bereits in deinem project verfügbar hast. Außerdem benötigen Sie nicht jedes Mal neue Daten, wenn Sie es rendern. Einfach bei der Auswahl von Wert 1 können Sie show Ihr instance Feld und wenn der Wert > 1 ist, können Sie clone um es weiter zu kopieren.

    
Shovon 16.10.2017 19:14
quelle
0

Verwenden Sie einfach gem Ссылка für die verschachtelten Formulare

    
itsnikolay 20.10.2017 13:51
quelle