Rails: link_to with block and GET params?

ground5hark picture ground5hark · Apr 26, 2010 · Viewed 15.3k times · Source

How can I achieve query string and URL parameters in a link_to block declaration? Right now, I have this, which works:

<%= link_to 'Edit', :edit, :type => 'book', :id => book %>

The above works, and outputs:

http://localhost:3000/books/edit/1?type=book

What I want to do is something like this:

<% link_to :edit, :type => 'book', :id => book do %>
    ...
<% end %>

But the above format outputs:

http://localhost:3000/books/edit/

Which isn't what I'm looking for... I want it to output a URL like the previous example.

How can I achieve this?

Answer

Damien Wilson picture Damien Wilson · Apr 26, 2010

link_to takes the same options that url_for does. Having said that, there is no :type option and it doesn't really accept blocks, so my guess is that the reason the your second example works is because it's located within the scope of a Book view. As mentioned by Tom in a reply to this answer, passing a block to link_to can be used as a replacement for the first argument (the link text).

If Book is a resource, you can get the link_to helper to generate the URL you're looking for by passing it one of the handy, automatically generated resource routes rails makes for you. Run rake routes before you try this:

<%= link_to "Edit", edit_book_path(book) %>

Otherwise, you can explicitly state what controller/action you want to link to:

<%= link_to "Edit", :controller => "books", :action => "edit", :id => book %>

Happy hacking.

EDIT: Almost forgot, you CAN add query strings bypassing them in AFTER you declare the id of the object you're linking to.

<%= link_to "Edit", edit_book_path(book, :query1 => "value", :query2 => "value")

Would product /books/1/edit?query1=value&query2=value. Alternatively:

<%= link_to "Edit", :controller => "books", :action => "edit", :id => book, :query1 => "value", :query2 => "value" %>