Utiliser Rails link_to pour les liens postant

J’ai un lien avec lequel je dois soumettre une demande de publication. Normalement, j’utiliserais jQuery et empêcherais le comportement par défaut du lien, puis soumettrais un formulaire à la destination. Cela semble être quelque chose que Rails devrait pouvoir m’aider. Bien sûr, la méthode link_to a une option pour spécifier une méthode HTTP POST:

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

Cela fonctionne, mais j’ai besoin d’append 2 parameters aussi. J’ai essayé:

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

Cela a simplement ajouté ces parameters au élément HTML, mais ne les a pas soumis en cliquant sur le lien:

 Profile 

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

La réponse courte est que si ce que vous entendez par “parameters” sont des champs de formulaire, alors vous ne pouvez tout simplement pas le faire (du moins pas de manière simple, 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 aviez des parameters de requête , alors cela fonctionnerait:

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

Vous pouvez encoder les parameters 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, vous feriez mieux d’utiliser un formulaire que un link_to .

Les parameters 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} %> 

Afin de POST 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 envoie le formulaire via JavaScript. Dans l’exemple ci-dessous, la ressource POST est simplement une action REST ne nécessitant aucun champ. Il n’y a donc aucun contrôle d’entrée de formulaire. Si vous souhaitez publier des données, placez simplement des champs de saisie masqués dans le formulaire.

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

Le formulaire est assigné à une classe afin que vous puissiez le styliser ou le masquer via CSS (par ex. ‘Display: inline’)

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

En général, je n’aime pas beaucoup les liens qui exécutent des requêtes POST . Je pense que c’est le rôle d’une forme et d’un bouton.

Ainsi, une alternative facile (et plus sûre) consiste à utiliser l’ outil

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

button_to prend également en charge l’option de method mais, par défaut, elle est supprimée.