Ich muss mehrere Senden-Schaltflächen haben.
Ich habe ein Formular, das eine Instanz von Contact_Call erstellt.
Eine Schaltfläche erstellt es wie gewohnt.
Die andere Schaltfläche erstellt es, muss jedoch einen anderen Attributwert als den Standardwert haben und das Attribut für ein anderes, aber verwandtes Modell festlegen, das in der Steuerung verwendet wird.
Wie mache ich das? Ich kann die Route nicht ändern. Gibt es also eine Möglichkeit, eine andere Variable zu senden, die von [: params] erfasst wird?
Und wenn ja, was mache ich dann im Controller, um eine case-Anweisung einzurichten?
ruby-on-rails
ruby
form-submit
Timothy T.
quelle
quelle
Antworten:
Sie können mehrere Senden-Schaltflächen erstellen und jeweils einen anderen Wert angeben:
Dies wird Folgendes ausgeben:
In Ihrem Controller wird der Wert der übermittelten Schaltfläche durch den Parameter identifiziert
commit
. Überprüfen Sie den Wert, um die erforderliche Verarbeitung durchzuführen:Denken Sie jedoch daran, dass dies Ihre Sicht eng mit dem Controller verbindet, was möglicherweise nicht sehr wünschenswert ist.
quelle
Es gibt auch einen anderen Ansatz, bei dem das Formatierungsattribut auf der Schaltfläche "Senden" verwendet wird:
Der Code bleibt sauber, da die standardmäßige Schaltfläche zum Erstellen keine Änderung erfordert. Sie fügen nur einen Routing-Pfad für die spezielle Schaltfläche ein:
quelle
Sie können alternativ erkennen, welche Taste gedrückt wurde, indem Sie den Attributnamen ändern.
Es ist ein bisschen unangenehm, weil Sie nach dem Vorhandensein von Parametertasten suchen müssen, anstatt nur den
params[:commit]
Wert zu überprüfen : Sie erhaltenparams[:a_button]
oderparams[:b_button]
je nachdem, welcher gedrückt wurde.quelle
Ähnliche Lösung wie bei @ vss123 ohne Verwendung von Edelsteinen:
Beachten Sie, dass ich die Verwendung von Wert vermeide und stattdessen den Eingabenamen verwende, da der Wert der Schaltfläche "Senden" häufig internationalisiert / übersetzt wird. Außerdem würde ich vermeiden, dies zu oft zu verwenden, da es Ihre Routendatei schnell überladen wird.
quelle
Wir haben mit erweiterten Einschränkungen in Schienen gelöst .
Die Idee ist, denselben Pfad (und damit dieselbe benannte Route und Aktion) zu haben, jedoch mit Einschränkungen, die an verschiedene Aktionen weitergeleitet werden.
CommitParamRouting
ist eine einfache Klasse mit einer Methode,matches?
die true zurückgibt, wenn der Commit-Parameter mit dem angegebenen Instanzattr übereinstimmt. Wert.Dies ist als Gem Commit_param_matching verfügbar .
quelle
Eine alte Frage, aber da ich mich mit der gleichen Situation befasst habe, dachte ich, ich würde meine Lösung veröffentlichen. Ich verwende Controller-Konstanten, um eine Diskrepanz zwischen der Controller-Logik und der Ansichtsschaltfläche zu vermeiden.
Und dann in der Ansicht:
Auf diese Weise lebt der Text nur an einer Stelle - als Konstante in der Steuerung. Ich habe jedoch noch nicht versucht herauszufinden, wie ich das machen soll.
quelle
Dank nested_form_fields habe ich eine variable Anzahl von Senden-Schaltflächen in meinem Formular, sodass es mir nicht ausreichte, nur den Namen zu verwenden. Am Ende habe ich ein verstecktes Eingabefeld in das Formular aufgenommen und es mit Javascript ausgefüllt, wenn eine der Schaltflächen zum Senden des Formulars gedrückt wurde.
quelle