link_to should have its body and url arguments reversed

I'd guess that it's because while the body is typically simple (a string or variable), the second argument can also be a bunch of params for url_for:

link_to 'thingy', :controller => 'wat', :action => 'huh', :protocol => 'wtf'

--Matt Jones

@Matt jones

I’d guess that it’s because while the body is typically simple (a string or variable), the second argument can also be a bunch of params for url_for:

link_to ‘thingy’, :controller => ‘wat’, :action => ‘huh’, :protocol => ‘wtf’

There are 4 signatures for the link_to helper method:

link_to(body, url, html_options = {}) link_to(body, url_options = {}, html_options = {}) link_to(options = {}, html_options = {}) link_to(url, html_options = {})

Your example would fit the second signature, which has no url argument, but a url_options hash instead. This is fine, options always go at the end of a method call.

The first signature is the one that bothers me.

@Zamith

link_to url: @person, body: “Click me”

I thought of that one too, but it’s almost just as ugly as

link_to “Click me”, @person

Another reason why it bothers me, is that the body can also be given as a block, in which case, tho body goes at the very end of the method call and the url at the beginning. So in case of a block-given body, the order is just reversed:

link_to @person do “Click me” end

Not very consistent, he?

You can always use

link_to @person { “Click me” }

if you find that infinitely more readable than

link_to “Click me”, @person

without the need to introduce a backwards incompatible change that would break every Rails app ever written.

It's ultimately a matter of symmetry, especially when switching from a hash to a URL helper:

  link_to 'something', :controller => 'posts', :action => 'show', :id => id

becomes:

  link_to 'something', post_path(id)

Requiring that the arguments trade positions between those two lines would be seriously annoying.

BTW, the bikeshed should TOTALLY be painted blue. :wink:

--Matt Jones