55

Ho un collegamento con cui ho bisogno di inviare una richiesta di post con. Normalmente, utilizzerei jQuery e prevengo il comportamento predefinito del collegamento e quindi invio un modulo alla destinazione. Sembra che Rails dovrebbe essere in grado di aiutarmi. Abbastanza sicuro, il metodo link_to ha un'opzione per specificare un metodo POST http:Utilizzo di Rails link_to per i link che pubblicano

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

che funziona, ma ho bisogno di aggiungere 2 parametri troppo. Ho provato:

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

Quella appena aggiunto quei parametri per l'elemento HTML <a>, ma non ha presentato quelli in cui cliccando sul link:

<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 i parametri usando link_to o qualsiasi altro metodo Rails? Sto usando Rails 3.2.9.

+0

non pensare di poterlo fare. probabilmente è meglio farlo sul tuo controller con net/http o HTTParty? –

+0

Impossibile farlo nel mio controller, l'utente deve essere indirizzato all'altro sito. Sembra che tu abbia ragione, non c'è un meccanismo di collegamento incorporato per farlo per me. –

risposta

94

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

Se d'altra parte si era fatto sì di query parametri, allora questo dovrebbe funzionare:

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

Appena aggiornata la mia domanda, in realtà sto usando un URL esterno per questi collegamenti. –

+0

Ho aggiunto una nota in pratica dicendo che ciò che si vuole fare non è possibile usando un collegamento. Hai bisogno di un modulo con un pulsante di invio. –

+2

È importante notare che se un utente ha disabilitato il javascript, il collegamento imposterà automaticamente una richiesta "GET". – bkunzi01

9

È possibile codificare i parametri nell'URL questo modo:

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

Se non lo fa Adatta alle tue esigenze, è meglio usare un modulo di un link_to.

+0

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

+0

Non funziona per i miei bisogni, i parametri devono essere parametri POST. Ma grazie, non sapevo del metodo to_param. Hai anche bisogno di un '' 'dopo il profilo. –

+0

Ok capisco, quindi penso che devi scrivere un modulo. Puoi scrivere un metodo di supporto che costruirà questo modulo se hai bisogno di ripetere questa logica più volte. –

1

Per i dati POST, è necessario un modulo. Tuttavia, non è necessario un pulsante di invio. Se vuoi che questo assomigli a un link per qualche motivo, puoi effettivamente renderlo un link 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 si desidera pubblicare alcuni dati, è sufficiente inserire 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') %> 

La forma viene assegnata una classe in modo da poter disegnarlo o nascondere tramite CSS (ad esempio 'display: inline')

1

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

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

Si noti che se l'utente ha disabilitato JS o le librerie JS non invadenti sono state rimosse per impostazione predefinita, link_to verrà inviato automaticamente tramite una richiesta GET.

In generale, non sono molto interessato ai collegamenti che eseguono le richieste POST. Penso che sia il ruolo di un modulo e un pulsante.

Così, un semplice (e più sicuro) alternativa è quella di utilizzare le rotaie button_to aiutante:

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

button_to supporta anche l'opzione method ma come il valore predefinito è post così ho semplicemente omesso di esso.