61 votes

Rails: boutons multi-soumission dans un seul formulaire

Dire que j'ai un modèle Article, et dans l'article "nouvelle" vue que j'ai deux boutons, "Publier" et "Enregistrer le Brouillon".

Ma question est comment puis-je savoir sur quel bouton est cliqué dans le contrôleur.

J'ai déjà une solution mais je pense qu'il doit y avoir une meilleure façon. Ce que j'ai actuellement utilisés dans le point de vue est:

<div class="actions">
  <%= f.submit "Publish" %>
  <%= f.submit "Save Draft", :name => "commit" %>
</div>

Ainsi, dans le contrôleur, je peux utiliser les params[:valider] chaîne de gérer cette action.

def create
  @article = Article.new(params[:article])
  if params[:commit] == "Publish"
    @article.status = 'publish'
    // detail omitted
  end

  @article.save
end

Mais je pense que l'utilisation de la vue liés à la chaîne n'est pas bon. Pourriez-vous me dire une autre façon d'accomplir cette?

Mise à JOUR: Depuis ces boutons sont de la même forme, ils vont tous à la "création" de l'action, et c'est OK pour moi. Ce que je veux, c'est pour le gérer dans l'action de création, comme donner le modèle Article d'une colonne état et titulaire d' "public" ou "brouillon".

67voto

John Topley Points 58789

Cela a été couvert dans l' épisode 38 de Railscast . L'utilisation de la table de hachage params pour détecter le bouton sur lequel vous avez cliqué constitue l'approche correcte.

7voto

vss123 Points 193

Nous avons résolus en utilisant les avancées de contraintes dans les rails.

L'idée est d'avoir le même chemin (et donc, du même nom que la route et l'action), mais avec des contraintes de routage pour les différentes actions.

resources :plan do
  post :save, constraints: CommitParamRouting.new("Propose"), action: :propose
  post :save, constraints: CommitParamRouting.new("Finalize"), action: :finalize
end

CommitParamRouting est une classe simple qui a une méthode matches? qui renvoie true si la validation param correspond à l'instance donnée attr. de la valeur.

Cette disposition comme un joyau commit_param_matching.

1voto

Alok Swain Points 2240

Je me souviens de venir à travers ce problème une fois. Vous ne pouvez pas maintenir les deux boutons et ensuite appeler une action fondée sur les params[:valider]. le bouton "soumettre" onclick va appeler l'url de la forme se réfère à l'. Il y a certaines mauvaises façons d'obtenir le comportement souhaité. Maintenir un bouton pour appeler l'action de la forme désigne et en obtenir un autre bouton pour appeler une action, j'ai utilisé un link_to puis changé les styles pour correspondre à un bouton. Aussi, alternativement, vous pouvez utiliser jQuery pour modifier l'url du formulaire d'appel, et donc décider de l'action est appelée au moment de l'exécution. Espérons que cette aide.

0voto

dennismonsewicz Points 4324

Vous pouvez également définir des attributs data sur les boutons d'envoi et utiliser JavaScript pour modifier l'action form en cliquant sur l'un des boutons.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X