如何在Rails中找出当前路线?

我需要知道在Railsfilter中的当前路线。 我怎么知道它是什么?

我正在做REST资源,并没有看到命名路线。

要找出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" 

要找出路线,即控制器,行动和参数:

 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 

如果你想在视图中特殊情况下,可以使用current_page? 如下所示:

 <% if current_page?(:controller => 'users', :action => 'index') %> 

…或行动和身份证…

 <% if current_page?(:controller => 'users', :action => 'show', :id => 1) %> 

…或命名的路线…

 <% if current_page?(users_path) %> 

…和

 <% if current_page?(user_path(1)) %> 

因为current_page? 需要一个控制器和动作,当我只关心控制器我做一个current_controller? ApplicationController中的方法:

  def current_controller?(names) names.include?(current_controller) end 

像这样使用它:

 <% if current_controller?('users') %> 

…也可以与多个控制器名称一起使用…

 <% if current_controller?(['users', 'comments']) %> 

我可以在2015年提出最简单的解决scheme(使用Rails 4进行validation,但也应该使用Rails 3)

 request.url # => "http://localhost:3000/lists/7/items" request.path # => "/lists/7/items" 

你可以这样做

 Rails.application.routes.recognize_path "/your/path" 

它适用于我的轨道3.1.0.rc4

在rails 3中,可以通过Rails.application.routes对象访问Rack :: Mount :: RouteSet对象,然后直接调用它来识别

 route, match, params = Rails.application.routes.set.recognize(controller.request) 

获得第一个(最好的)匹配,下面的块表单循环遍历匹配的路由:

 Rails.application.routes.set.recognize(controller.request) do |r, m, p| ... do something here ... end 

一旦你有了路线,你可以通过route.name得到路线名称。 如果您需要获取特定URL的路由名称,而不是当前的请求path,那么您需要模拟一个假请求对象传递到机架,检查出ActionController :: Routing :: Routes.recognize_path以查看他们是如何做的。

我假设你是指URI:

 class BankController < ActionController::Base before_filter :pre_process def index # do something end private def pre_process logger.debug("The URL" + request.url) end end 

根据您的评论,如果您需要控制器的名称,您可以简单地执行此操作:

  private def pre_process self.controller_name # Will return "order" self.controller_class_name # Will return "OrderController" end 

如果你还需要参数

 current_fullpath = request.env ['ORIGINAL_FULLPATH']
 #如果您正在浏览http://example.com/my/test/path?param_n=N 
那么current_fullpath将指向“/ my / test / path?param_n = N”

请记住,您始终可以在视图中调用<%= debug request.env %>来查看所有可用的选项。

基于@AmNaN的build议(更多细节):

 class ApplicationController < ActionController::Base def current_controller?(names) names.include?(params[:controller]) unless params[:controller].blank? || false end helper_method :current_controller? end 

现在,您可以调用它,例如在导航布局中将列表项标记为活动状态:

 <ul class="nav nav-tabs"> <li role="presentation" class="<%= current_controller?('items') ? 'active' : '' %>"> <%= link_to user_items_path(current_user) do %> <i class="fa fa-cloud-upload"></i> <% end %> </li> <li role="presentation" class="<%= current_controller?('users') ? 'active' : '' %>"> <%= link_to users_path do %> <i class="fa fa-newspaper-o"></i> <% end %> </li> <li role="presentation" class="<%= current_controller?('alerts') ? 'active' : '' %>"> <%= link_to alerts_path do %> <i class="fa fa-bell-o"></i> <% end %> </li> </ul> 

对于usersalerts路线, current_page? 就足够了:

  current_page?(users_path) current_page?(alerts_path) 

但是嵌套的路由和请求控制器的所有操作(与items相比), current_controller? 对我来说是更好的方法:

  resources :users do resources :items end 

第一个菜单项对于以下路线是活跃的:

  /users/x/items #index /users/x/items/x #show /users/x/items/new #new /users/x/items/x/edit #edit 

或者,更优雅的是: request.path_info

资源:
请求机架文档

request.url

request.path#获取除基本url以外的path

你可以看到所有的路线通过耙:路线(这可能会帮助你)。

你可以做request.env['REQUEST_URI']查看完整的请求的URI ..它会输出如下

 http://localhost:3000/client/1/users/1?name=test