100 votes

Utilisation de Rails link_to pour les liens qui s'affichent

J'ai un lien avec lequel je dois soumettre une demande de poste. Normalement, j'utiliserais jQuery pour empêcher le comportement par défaut du lien, puis je soumettrais un formulaire à la destination. Il me semble que Rails devrait être en mesure de m'aider dans ce domaine. En effet, le link_to comporte une option permettant de spécifier une méthode http POST :

link_to "Profile", 'http://example.com/profile', method: :post

Cela fonctionne, mais je dois aussi ajouter 2 paramètres. J'ai essayé :

link_to "Profile", 'http://example.com/profile', method: post, param1: 'value1', param2: 'value2'

Cela a juste ajouté ces paramètres à la <a> élément HTML, mais ne les a pas soumis en cliquant sur le lien :

<a rel="nofollow" param1="value1" param2="value2" data-method="post" href="http://example.com/profile">Profile</a>

Existe-t-il un moyen d'effectuer une requête POST avec des paramètres en utilisant la fonction link_to ou toute autre méthode Rails ? J'utilise Rails 3.2.9.

158voto

shioyama Points 15314

La réponse courte est que si ce que vous entendez par "paramètres" sont des champs de formulaire, alors vous ne pouvez tout simplement pas le faire (du moins pas d'une manière directe que je puisse voir). Vous devriez plutôt utiliser un formulaire avec un bouton d'envoi, stylisé pour ressembler à un lien (si c'est ce à quoi vous voulez qu'il ressemble).

Si par contre vous aviez voulu dire requête paramètres, alors cela fonctionnerait :

link_to "Profile", profile_path(@profile.id, param1: 'value1', param2: 'value2'), method: :post

10voto

rkon Points 1847

Notez que si l'utilisateur a désactivé JS ou si vous avez supprimé les bibliothèques JS discrètes fournies par défaut, link_to sera soumis en silence via un GET demande.

En général, je n'aime pas trop avoir des liens qui exécutent POST demandes. Je pense que c'est le rôle d'un formulaire et d'un bouton.

Ainsi, une alternative facile (et plus sûre) est d'utiliser la méthode Rails Bouton_to aide :

button_to 'Profile', profile_path(@profile, param1: 'value1', param2: 'value2')

button_to soutient également le method mais comme la valeur par défaut est post donc je l'ai juste omis.

8voto

Adrien Coquio Points 2906

Vous pouvez encoder les paramètres dans l'URL de cette façon :

link_to "Profile", 'http://example.com/profile?' + {param1: 'value1', param2: 'value2'}.to_param, method: :post

S'il ne répond pas à vos besoins, vous feriez mieux d'utiliser un formulaire plutôt qu'une link_to .

1voto

Ammo Goettsch Points 315

Pour pouvoir envoyer des données, vous avez besoin d'un formulaire. Cependant, vous n'avez pas besoin d'un bouton d'envoi. Si vous voulez que cela ressemble à un lien pour une raison quelconque, vous pouvez en fait en faire un lien qui soumet le formulaire via JavaScript. Dans l'exemple ci-dessous, la ressource POST n'est qu'une action REST qui ne nécessite pas de champs, il n'y a donc pas de contrôles de saisie de formulaire. Si vous voulez envoyer des données, il suffit de mettre des champs de saisie cachés dans le formulaire.

<%= form_tag('http://something_postable', :method => :post, :class => 'internal') %></form>
<%= link_to_function('Label for Link', 'previous("form").submit()', :title => 'Hover text for link') %>

Une classe est attribuée au formulaire afin que vous puissiez le styliser ou le masquer à l'aide de CSS (par exemple, "display : inline").

1voto

pangpang Points 5213

Les paramètres et la méthode http devraient être ensemble {param1: 'value1', param2: 'value2', :method: :post}

<%= link_to "Profile", profile_path(@profile), {param1: 'value1', param2: 'value2', method: :post} %>

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