J'ai besoin de plusieurs boutons d'envoi.
J'ai un formulaire qui crée une instance de Contact_Call.
Un bouton le crée normalement.
L'autre bouton le crée mais doit avoir une valeur d'attribut différente de la valeur par défaut, et il doit également définir l'attribut sur un modèle différent, mais lié, utilisé dans le contrôleur.
Comment je fais ça? Je ne peux pas changer l'itinéraire, alors existe-t-il un moyen d'envoyer une variable différente qui est captée par [: params]?
Et si je fais alors, que dois-je faire dans le contrôleur, mettre en place une déclaration de cas?
ruby-on-rails
ruby
form-submit
Timothy T.
la source
la source
Réponses:
Vous pouvez créer plusieurs boutons d'envoi et fournir une valeur différente à chacun:
Cela produira:
À l'intérieur de votre contrôleur, la valeur du bouton soumis sera identifiée par le paramètre
commit
. Vérifiez la valeur pour effectuer le traitement requis:Cependant, rappelez-vous que cela couple étroitement votre vue au contrôleur, ce qui peut ne pas être très souhaitable.
la source
Il existe également une autre approche, utilisant l'attribut formaction sur le bouton d'envoi:
Le code reste propre, car le bouton de création standard ne nécessite aucune modification, vous insérez uniquement un chemin de routage pour le bouton spécial:
la source
Vous pouvez également reconnaître quel bouton a été enfoncé en changeant son nom d'attribut.
C'est un peu inconfortable car vous devez vérifier la présence des touches de paramètres au lieu de simplement vérifier la
params[:commit]
valeur: vous recevrezparams[:a_button]
ou enparams[:b_button]
fonction de celle qui a été pressée.la source
Solution similaire à celle suggérée par @ vss123 sans utiliser de gemmes:
Notez que j'évite d'utiliser la valeur et d'utiliser le nom d'entrée à la place, car la valeur du bouton d'envoi est souvent internationalisée / traduite. De plus, j'éviterais de trop l'utiliser car cela encombrera rapidement votre fichier de routes.
la source
Nous avons résolu en utilisant des contraintes avancées dans les rails.
L'idée est d'avoir le même chemin (et donc la même route & action nommée) mais avec des contraintes de routage vers différentes actions.
CommitParamRouting
est une classe simple qui a une méthodematches?
qui renvoie true si le paramètre de validation correspond à l'instance attr. valeur.Ceci est disponible sous forme de gem commit_param_matching .
la source
Une vieille question, mais comme je fais face à la même situation, j'ai pensé afficher ma solution. J'utilise des constantes de contrôleur pour éviter d'introduire une différence entre la logique du contrôleur et le bouton d'affichage.
Et puis dans la vue:
De cette façon, le texte ne vit qu'à un seul endroit - en tant que constante dans le contrôleur. Cependant, je n'ai pas encore essayé de comprendre comment y parvenir.
la source
J'ai un nombre variable de boutons d'envoi sur mon formulaire grâce à nested_form_fields, donc utiliser le nom ne me suffisait pas. J'ai fini par inclure un champ de saisie caché dans le formulaire et utiliser Javascript pour le remplir lorsque l'un des boutons de soumission du formulaire était enfoncé.
la source