ActionController::UrlRewriter's url_for and link_to


I'm upgrading an app to 2.3 and can't figure out how to resolve this

In earlier versions (I'm coming from 2.1) link_to did this:

url = case options
  when String
  when :back
    @controller.request.env["HTTP_REFERER"] || 'javascript:history.back

whereas now it just does a unconditional

url = url_for(options)

If you include


somewhere and do a link_to with a named route you get the nice
"TypeError: can't convert String into Hash" exception, because url_for
in UrlWriter doesn't know how to handle Strings.

Would love to work on a patch, but I have no idea how this is supposed
to work:

    * just change the link_to implementation?
    * change UrlWriter#url_for to handle Strings as options?
    * am I doing something wrong?


There are, I believe, three separate implementations of #url_for: one
in ActionController::Base, one in ActionController::UrlWriter, and one
in ActionView::Helpers::UrlHelper. I've looked for the exact
incantation for when, and in what order, to include each of these
without success; also, they communicate to one another through
instance variable, which you have to have set up correctly.

Where exactly are you running into these problems? As unsatisfying as
this answer will be for you, I generally solve these types of problems
by only creating URLs in Rails-sanctioned objects (controllers and
views). It's possible to get the behavior working in other objects,
but it will make your head hurt.