Utilizzo di Rails link_to per i link che postano


86

Ho un link con cui devo inviare una richiesta di post. Normalmente, userei jQuery e impedirei il comportamento predefinito del collegamento e quindi inviare un modulo alla destinazione. Sembra che Rails dovrebbe essere in grado di aiutarmi. Abbastanza sicuro, il link_tometodo ha un'opzione per specificare un metodo http POST:

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

Funziona, ma devo aggiungere anche 2 parametri. Provai:

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

Questo ha appena aggiunto quei parametri <a>all'elemento HTML, ma non li ha inviati quando si fa clic sul collegamento:

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

C'è un modo per fare una richiesta POST con parametri usando link_too qualsiasi altro metodo Rails? Sto usando Rails 3.2.9.


non credo di poterlo fare. probabilmente è meglio farlo nel tuo controller con net / http o HTTParty?
Mike Campbell

Non posso farlo nel mio controller, l'utente deve essere indirizzato all'altro sito. Sembra che tu abbia ragione, però, non c'è un meccanismo di collegamento integrato per farlo per me.
a.

Risposte:


143

La risposta breve è che se ciò che intendi per "parametri" sono campi modulo, allora semplicemente non puoi farlo (almeno non in un modo semplice che io possa vedere). Dovresti invece utilizzare un modulo con un pulsante di invio, con uno stile simile a un collegamento (se è quello che vuoi che assomigli).

Se d'altra parte avessi inteso parametri di query , allora funzionerebbe:

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

1
Ho appena aggiornato la mia domanda, in realtà sto utilizzando un URL esterno per questi collegamenti.
a.

Ho aggiunto una nota fondamentalmente dicendo che ciò che vuoi fare non è possibile usando un link. Hai bisogno di un modulo con un pulsante di invio.
Chris Salzberg

3
È importante notare che se un utente ha javascript disabilitato, il collegamento sarà impostato come predefinito su una richiesta "GET".
bkunzi01

9

Puoi codificare i parametri nell'URL in questo modo:

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

Se non soddisfa le tue esigenze, è meglio utilizzare un modulo piuttosto che un file link_to.


Questo è davvero un modo molto carino per aggiungere i parametri.
nathanvda

Non funziona per le mie esigenze, i parametri devono essere parametri POST. Ma grazie, non sapevo del metodo to_param. Hai anche bisogno di un ?profilo dopo.
a.

Ok ho capito, quindi penso che devi scrivere un modulo. È possibile scrivere un metodo di supporto che creerà questo modulo se è necessario ripetere questa logica più volte.
Adrien Coquio

1
Nonostante questo non risponda alla domanda dell'OP, dovresti usare un url helper per questo come nella risposta di @ shioyama
Ben West

@BenWest: l'helper non è stato inizialmente utilizzato e ho pensato che fosse significativo (potrebbe essere stato un URL esterno per esempio)
Adrien Coquio

3

Nota che se l'utente ha JS disabilitato o hai rimosso le discrete librerie JS fornite per impostazione predefinita, link_toverranno inviate silenziosamente tramite una GETrichiesta.

In generale, non mi piace molto avere collegamenti che eseguono POSTrichieste. Penso che questo sia il ruolo di un modulo e di un pulsante.

Quindi, un'alternativa facile (e più sicura) è usare il pulsante Rails_to helper:

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

button_tosupporta anche l' methodopzione, ma poiché è predefinita, l' postho appena omessa.


D'accordo con Kostas. Inoltre, link_to con il metodo post non funziona bene su Internet Explorer.
Pierre-Yves O.

1

Per effettuare il POST dei dati, è necessario un modulo. Tuttavia, non è necessario un pulsante di invio. Se vuoi che questo appaia come un collegamento per qualche motivo, puoi effettivamente renderlo un collegamento che invia il modulo tramite JavaScript. Nell'esempio seguente, la risorsa POST è solo un'azione REST che non richiede alcun campo, quindi non ci sono controlli di input del modulo. Se vuoi inserire dei dati, inserisci semplicemente dei campi di input nascosti nel modulo.

<%= 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 modulo viene assegnata una classe in modo che tu possa modellarlo o nasconderlo tramite CSS (ad esempio 'display: inline')


1

I parametri e il metodo http dovrebbero essere insieme {param1: 'value1', param2: 'value2', :method: :post}

<%= link_to "Profile", profile_path(@profile), {param1: 'value1', param2: 'value2', method: :post} %>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.