If you are trying to special case something in a view, you can use current_page?
as in:
<% if current_page?(:controller => 'users', :action => 'index') %>
...or an action and id...
<% if current_page?(:controller => 'users', :action => 'show', :id => 1) %>
...or a named route...
<% if current_page?(users_path) %>
...and
<% if current_page?(user_path(1)) %>
Because current_page?
requires both a controller and action, when I care about just the controller I make a current_controller?
method in ApplicationController:
def current_controller?(names)
names.include?(current_controller)
end
And use it like this:
<% if current_controller?('users') %>
...which also works with multiple controller names...
<% if current_controller?(['users', 'comments']) %>
To find out URI:
current_uri = request.env['PATH_INFO']
# If you are browsing http://example.com/my/test/path,
# then above line will yield current_uri as "/my/test/path"
To find out the route i.e. controller, action and params:
path = ActionController::Routing::Routes.recognize_path "/your/path/here/"
# ...or newer Rails versions:
#
path = Rails.application.routes.recognize_path('/your/path/here')
controller = path[:controller]
action = path[:action]
# You will most certainly know that params are available in 'params' hash
Simplest solution I can come up with in 2015 (verified using Rails 4, but should also work using Rails 3)
request.url
# => "http://localhost:3000/lists/7/items"
request.path
# => "/lists/7/items"
You can do this
Rails.application.routes.recognize_path "/your/path"
It works for me in rails 3.1.0.rc4
In rails 3 you can access the Rack::Mount::RouteSet object via the Rails.application.routes object, then call recognize on it directly
route, match, params = Rails.application.routes.set.recognize(controller.request)
that gets the first (best) match, the following block form loops over the matching routes:
Rails.application.routes.set.recognize(controller.request) do |r, m, p|
... do something here ...
end
once you have the route, you can get the route name via route.name. If you need to get the route name for a particular URL, not the current request path, then you'll need to mock up a fake request object to pass down to rack, check out ActionController::Routing::Routes.recognize_path to see how they're doing it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With