Usando Rails link_to para los enlaces que publican

85

Tengo un enlace con el que necesito enviar una solicitud de publicación. Normalmente, usaría jQuery y evitaría el comportamiento predeterminado del enlace y luego enviaría un formulario al destino. Esto parece algo en lo que Rails debería poder ayudarme. Efectivamente, el link_tométodo tiene una opción para especificar un método http POST:

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

Eso funciona, pero también necesito agregar 2 parámetros. Lo intenté:

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

Eso solo agregó esos parámetros al <a>elemento HTML, pero no los envió al hacer clic en el enlace:

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

¿Hay alguna forma de hacer una solicitud POST con parámetros usando link_too cualquier otro método Rails? Estoy usando Rails 3.2.9.

a.
fuente
no creo que puedas hacer eso. probablemente lo mejor es hacerlo en su controlador con net / http o HTTParty?
Mike Campbell
No puedo hacerlo en mi controlador, el usuario debe ser dirigido al otro sitio. Sin embargo, parece que tiene razón, no hay un mecanismo de enlace incorporado para hacer esto por mí.
en.

Respuestas:

143

La respuesta corta es que si lo que quiere decir con "parámetros" son campos de formulario, entonces simplemente no puede hacer esto (al menos no de una manera sencilla que yo pueda ver). En su lugar, debe usar un formulario con un botón de envío, diseñado para que parezca un enlace (si así es como desea que se vea).

Si, por otro lado, se hubiera referido a parámetros de consulta , esto funcionaría:

link_to "Profile", profile_path(@profile.id, param1: 'value1', param2: 'value2'), method: :post
Chris Salzberg
fuente
1
Acabo de actualizar mi pregunta, en realidad estoy usando una URL externa para estos enlaces.
en.
He agregado una nota que básicamente dice que lo que quieres hacer no es posible usando un enlace. Necesita un formulario con un botón de envío.
Chris Salzberg
3
Es importante tener en cuenta que si un usuario tiene javascript deshabilitado, el enlace predeterminado será una solicitud "GET".
bkunzi01
8

Puede codificar parámetros en la URL de esta manera:

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

Si no se ajusta a sus necesidades, es mejor que utilice un formulario que un link_to.

Adrien Coquio
fuente
De hecho, esta es una forma muy agradable de agregar los parámetros.
nathanvda
No funciona para mis necesidades, los parámetros deben ser parámetros POST. Pero gracias, no sabía nada del método to_param. También necesitas un ?perfil posterior.
en.
Ok, entiendo, entonces creo que tienes que escribir un formulario. Puede escribir un método auxiliar que creará este formulario si necesita repetir esta lógica varias veces.
Adrien Coquio
1
A pesar de que esto no responde a la pregunta del OP, debe usar un asistente de URL para esto como en la respuesta de @ shioyama
Ben West
@BenWest: el asistente no se usó inicialmente y asumí que era significativo (puede haber sido una URL externa, por ejemplo)
Adrien Coquio
3

Tenga en cuenta que si el usuario tiene JS deshabilitado o ha eliminado las bibliotecas JS discretas que vienen por defecto, se link_toenviarán silenciosamente a través de unGET solicitud.

En general, no me gusta mucho tener enlaces que funcionen POST solicitudes. Creo que ese es el papel de una forma y un botón.

Por lo tanto, una alternativa fácil (y más segura) es usar Rails button_to helper:

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

button_totambién es compatible con la methodopción, pero como está predeterminada post, la he omitido.

Kostas Rousis
fuente
De acuerdo con Kostas. Además, link_to con el método de publicación no funciona bien en Internet Explorer.
Pierre-Yves O.6 de
1

Para POSTAR datos, necesita un formulario. Sin embargo, no necesita un botón de envío. Si desea que se vea como un enlace por alguna razón, puede convertirlo en un enlace que envíe el formulario a través de JavaScript. En el siguiente ejemplo, el recurso POST es solo una acción REST que no requiere ningún campo, por lo que no hay controles de entrada de formulario. Si desea publicar algunos datos, simplemente coloque campos de entrada ocultos en el formulario.

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

Al formulario se le asigna una clase para que pueda diseñarlo u ocultarlo a través de CSS (por ejemplo, 'display: inline')

Munición Goettsch
fuente
1

Los parámetros y el método http deben estar juntos {param1: 'value1', param2: 'value2', :method: :post}

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