Hi,
When I moved from Rails 2.1 to edge, I found that the old trick of
putting
include ActionView::Helpers::UrlHelper # provides link_to
include ActionController::UrlWriter # provides url_for
into models didn't work as well as it used to because of
http://github.com/rails/rails/commit/c98692abcfd3576ee5fcde3910330d1eb39a18a5
Prior to this commit, you could rely on link_to to return immediately
when it saw a string like
link_to "Visit Other Site", "http://www.rubyonrails.org/"
which effectively prevented it from passing non-hashes to
ActionController::UrlWriter's url_for.
How do you solve the problem of using link_to (and rendering html in
general) when you don't have a controller?
Am I missing an obviously better approach?
Thank you,
Seamus
Prior to this commit, you could rely on link_to to return immediately
when it saw a string like
link_to "Visit Other Site", "http://www.rubyonrails.org/"
which effectively prevented it from passing non-hashes to
ActionController::UrlWriter's url_for.
What's the error that you see, url_for should just return the string
shouldn't it?
How do you solve the problem of using link_to (and rendering html in
general) when you don't have a controller?
This is still a little trickier than it could be, that's one of the
key things that I hope we can get out of rails3's Action View changes.
Yehuda's putting a stack of work into figuring out a nice, stable API
for rendering. Hopefully we can give you something you could subclass
and have a really easy job for generating HTML outside of controllers
and mailers.
What's the error that you see, url_for should just return the string
shouldn't it?
The error is "can't convert String into Hash." If I understand correctly, it's caused by a namespace collision due to the order of includes:
include ActionView::Helpers::UrlHelper # provides link_to (and also url_for)
include ActionController::UrlWriter # provides url_for
So ActionView's link_to method actually calls ActionController's url_for directly, instead of the one that it itself defines.
Before the commit that I mentioned, this wasn't a problem, because both versions of url_for handled strings. The commit DRYs things up nicely for normal usage.
Finally, I don't think you can switch around the order of the includes, because ActionView's url_for depends on ActionController's url_for.
Thanks for your reply!
Seamus