Usando Rails link_to para links que postam

86

Tenho um link com o qual preciso enviar uma solicitação de postagem. Normalmente, eu usaria jQuery e evitaria o comportamento padrão do link e, em seguida, enviaria um formulário para o destino. Isso parece algo com que Rails deveria ser capaz de me ajudar. Com certeza, o link_tométodo tem uma opção para especificar um método POST http:

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

Isso funciona, mas preciso adicionar 2 parâmetros também. Eu tentei:

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

Isso apenas adicionou esses parâmetros ao <a>elemento HTML, mas não os enviou ao clicar no link:

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

Existe uma maneira de fazer uma solicitação POST com parâmetros usando link_toou qualquer outro método Rails? Estou usando o Rails 3.2.9.

em
fonte
não pense que você pode fazer isso. provavelmente é melhor fazê-lo em seu controlador com net / http ou HTTParty?
Mike Campbell
Não consigo fazer no meu controlador, o usuário precisa ser direcionado para o outro site. Parece que você está certo, não existe um mecanismo de link embutido para fazer isso por mim.
em.

Respostas:

143

A resposta curta é que se o que você quer dizer com "parâmetros" são campos de formulário, então você simplesmente não pode fazer isso (pelo menos não de uma maneira direta que eu possa ver). Em vez disso, você deve usar um formulário com um botão de envio, estilizado para se parecer com um link (se é assim que você deseja).

Se, por outro lado, você quisesse dizer parâmetros de consulta , isso funcionaria:

link_to "Profile", profile_path(@profile.id, param1: 'value1', param2: 'value2'), method: :post
Chris Salzberg
fonte
1
Acabei de atualizar minha pergunta. Na verdade, estou usando uma URL externa para esses links.
em.
Eu adicionei uma nota basicamente dizendo que o que você deseja fazer não é possível usando um link. Você precisa de um formulário com um botão de envio.
Chris Salzberg
3
É importante observar que se um usuário desabilitou o javascript, o link assumirá como padrão uma solicitação "GET".
bkunzi01
9

Você pode codificar parâmetros no URL desta maneira:

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

Se não atender às suas necessidades, é melhor usar um formulário do que um link_to.

Adrien Coquio
fonte
Esta é de fato uma maneira muito boa de adicionar os parâmetros.
nathanvda
Não funciona para minhas necessidades, os parâmetros precisam ser parâmetros POST. Mas obrigado, eu não sabia sobre o método to_param. Você também precisa de um ?perfil posterior.
em.
Ok, entendo, então acho que você tem que escrever um formulário. Você pode escrever um método auxiliar que construirá este formulário se precisar repetir essa lógica várias vezes.
Adrien Coquio
1
Apesar de isso não responder à pergunta do OP, você deve usar um auxiliar de url para isso, como na resposta de @shioyama
Ben West
@BenWest: o auxiliar não foi usado inicialmente e presumi que fosse significativo (pode ter sido um URL externo, por exemplo)
Adrien Coquio
3

Observe que se o usuário desativou JS ou removeu as bibliotecas JS discretas que vêm por padrão, link_toserão enviadas silenciosamente por meio de uma GETsolicitação.

Em geral, não gosto muito de ter links que realizam POSTrequisições. Acho que essa é a função de um formulário e um botão.

Assim, uma alternativa fácil (e mais segura) é usar o helper button_to do Rails :

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

button_totambém suporta a methodopção, mas como o padrão posté, acabei de omiti-la.

Kostas Rousis
fonte
Concordo com Kostas. Além disso, link_to com método post não funciona bem no Internet Explorer.
Pierre-Yves O.
1

Para POSTAR dados, você precisa de um formulário. No entanto, você não precisa de um botão de envio. Se quiser que isso pareça um link por algum motivo, você pode realmente torná-lo um link que envia o formulário via JavaScript. No exemplo abaixo, o recurso POST é apenas uma ação REST que não requer nenhum campo, portanto, não há controles de entrada de formulário. Se você quiser postar alguns dados, basta colocar os campos de entrada ocultos no formulário.

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

O formulário é atribuído a uma classe para que você possa estilizá-lo ou ocultá-lo via CSS (por exemplo, 'display: inline')

Munição Goettsch
fonte
1

Os parâmetros e o método http devem estar juntos {param1: 'value1', param2: 'value2', :method: :post}

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