Accessing the router from a helper

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