I find manually accessing the router to be quite ugly below. Is there
a more direct way to access it?
module ApplicationHelper
def menu_item text, url = nil
routes = ActionController::Routing::Routes
url = if url
if url.is_a? String
url
else
routes.generate url
end
else
routes.generate :controller => text
end
unless text.is_a? String
text = t text
end
active = request.request_uri == url
"<li #{'class="active"' if active}>#{ link_to text, url }</li>"
end
end
Thomas
Would using url_for() not save you a lot of hassle generating that url?
Thanks Michael, url_for was what I was looking for in place of
manually grabbing the router. But why do you think that would change
the line you quoted?
Here is the updated method:
def menu_item text, url = {}
unless url[:access] and active_user.cannot? url[:access]
routes = ActionController::Routing::Routes
unless url.is_a? String
if url[:controller]
url = url_for url
else
url = url_for :controller => text
end
end
unless text.is_a? String
text = t text
end
active = request.request_uri == url
"<li#{' class="active"' if active}>#{ link_to text, url }</li>"
end
end
Thomas
It wouldn't necessarily; I was just referring to its use of the "url" variable.
Ah, that makes sense now. For the sake of correctness, the final code
(with a yield and without the unused routes variable):
def menu_item text, url = {}
unless url[:access] and active_user.cannot? url[:access]
unless url.is_a? String
if url[:controller]
url = url_for url
else
url = url_for :controller => text
end
end
unless text.is_a? String
text = t text
end
active = request.request_uri == url
content = link_to text, url
if block_given?
content << yield
end
"<li#{' class="active"' if active}>#{content}</li>"
end
end
Thomas