web-dev-qa-db-fra.com

Utilisation de Rails link_to pour les liens postés

J'ai un lien que je dois soumettre une demande de publication avec. Normalement, j'utilisais jQuery et empêchais le comportement par défaut du lien, puis envoyais un formulaire à la destination. Cela ressemble à quelque chose Rails devrait être capable de m'aider avec. Assez, le link_to La méthode a une option pour spécifier une méthode POST http:

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 vient d'ajouter 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>

Est-il possible de faire une requête POST avec des paramètres utilisant link_to ou toute autre méthode Rails? J'utilise Rails 3.2.9.

77
at.

La réponse courte est que si ce que vous entendez par "paramètres" est un champ de formulaire, vous ne pouvez tout simplement pas le faire (du moins, pas de façon directe, comme je peux le voir). Vous devriez plutôt utiliser un formulaire avec un bouton d'envoi, conçu pour ressembler à un lien (si c'est ce que vous voulez qu'il ressemble).

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

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

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

Si cela ne correspond pas à vos besoins, il vaut mieux utiliser un formulaire qu'un link_to.

8
Adrien Coquio

Notez que si l'utilisateur a désactivé JS ou que vous avez supprimé les bibliothèques JS non intrusives fournies par défaut, link_to sera soumis en mode silencieux via une requête GET.

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

Ainsi, une alternative facile (et plus sûre) consiste à utiliser l’aide Rails button_to =>: =):

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

button_to prend également en charge l'option method, mais sa valeur par défaut est post et je l'ai donc simplement omis.

2
Kostas Rousis

Afin de POST données, vous avez besoin d'un formulaire. Toutefois, vous n'avez pas besoin d'un bouton d'envoi. Si vous souhaitez que ce lien ressemble à un lien pour une raison quelconque, vous pouvez en faire un lien qui soumet le formulaire via JavaScript. Dans l'exemple ci-dessous, la ressource POST est simplement une action REST qui ne nécessite aucun champ, il n'y a donc pas de formulaire Si vous souhaitez publier 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 affectée au formulaire afin que vous puissiez la styler ou la masquer via CSS (par exemple, 'display: inline')

2
Ammo Goettsch

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

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