I have a link that I need to submit a post request with. Normally, I'd use jQuery and prevent the link's default behavior and then submit a form to the destination. This seems like something Rails should be able to help me out with. Sure enough, the link_to
method has an option for specifying a POST http method:
link_to "Profile", 'http://example.com/profile', method: :post
That works, but I need to add 2 parameters too. I tried:
link_to "Profile", 'http://example.com/profile', method: post, param1: 'value1', param2: 'value2'
That just added those parameters to the <a>
HTML element, but didn't submit those when clicking the link:
<a rel="nofollow" param1="value1" param2="value2" data-method="post" href="http://example.com/profile">Profile</a>
Is there a way to do a POST request with parameters using link_to
or any other Rails method? I'm using Rails 3.2.9.
You can encode parameters in the URL this way :
If it does not fit your needs you are better use a form than a
link_to
.Note that if the user has JS disabled or you have removed the unobtrusive JS libraries that come by default,
link_to
will be silently submitted via aGET
request.In general, I am not very fond of having links that perform
POST
requests. I think that's the role of a form and a button.Thus, an easy (and safer) alternative is to use the Rails button_to helper:
button_to
also supports themethod
option but as it defaults topost
so I've just omitted it.In order to POST data, you need a form. However, you don't need a submit button. If you want this to look like a link for some reason, you can actually make it a link that submits the form via JavaScript. In the example below, the POST resource is just a REST action that does not require any fields so there are no form input controls. If you wanted to post some data, just put hidden input fields in the form.
The form is assigned a class so you can style it or hide it via CSS (e.g. 'display: inline')
The short answer is that if what you mean by "parameters" is form fields, then you simply can't do this (at least not in a straightforward way that I can see). You should instead use a form with a submit button, styled to look like a link (if that's what you want it to look like).
If on the other hand you had meant query parameters, then this would work:
The parameters and the http method should be together
{param1: 'value1', param2: 'value2', :method: :post}