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