2009-07-30 74 views
178

我需要知道Rails中过滤器中的当前路由。我如何知道它是什么?如何在Rails中找出当前路线?

我在做REST资源,并且没有看到命名的路由。

+3

什么是你试图用这个来完成?当你说“路线”时,你的意思是“URI”吗? – jdl 2009-07-30 01:14:53

+0

有关如何在[中间件](http://stackoverflow.com/q/42691729/1610034)中获取它的任何想法。 – Saurabh 2017-03-14 08:03:46

回答

178

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

要找出途径,即控制器,动作,而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 
+2

您是否碰巧知道这是否与Rails 3中的方法相同/正确?我确信它仍然可以访问,但我只想确保我遵守最新的惯例。 – John 2010-10-29 20:46:33

+34

当前的控制器和动作总是在`params [:controller]`和`params [:action]`中可用。但是,除此之外,如果您想识别路线,则此API不再可用。它现在已经转向了`ActionDispatch :: Routing`,我还没有尝试过``recognition_path`。 – Swanand 2010-10-30 07:53:32

4

我假设你的意思是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 
+0

是的,我做到了,但我希望以更好的方式。我需要的是知道哪个控制器已被调用,但我有非常复杂的嵌套资源.. request.path_parameters('控制器')似乎不适合我。 – luca 2009-07-30 08:12:40

+0

`self.controller_name`和`self.controller_class_name`不需要'self.` – weltschmerz 2015-07-24 18:06:07

2

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

+2

rails 3.0 - > $ rake routes – Intentss 2010-08-12 00:00:47

+0

我更喜欢打开一个无效路径的新选项卡,并查看所有路径/路径浏览器,因为它们更漂亮。 但我不认为这有助于获得目前的路线。 – ahnbizcad 2014-07-02 01:25:36

255

如果你想特例的东西在一个视图中,可以使用current_page?如:

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

...或动作和id ...

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

...或命名路线...

<% if current_page?(users_path) %> 

...和

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

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

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

而且使用这样的:

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

...这还与多个控制器名称...

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

在Rails 3,您可以访问机架::摩:: RouteSet对象经由Rails.application.routes对象,然后在其上调用识别直接

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的路由名称,而不是当前请求路径,那么您需要模拟虚拟请求对象以传递到机架,查看ActionController :: Routing :: Routes.recognize_path以查看他们是如何做的。

17

你可以做到这一点

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

它为我在轨3.1.0.rc4

4

如果您还需要参数

 
current_fullpath = request.env['ORIGINAL_FULLPATH'] 
# If you are browsing http://example.com/my/test/path?param_n=N 
# then current_fullpath will point to "/my/test/path?param_n=N" 

请记住,你可以始终致电<%= debug request.env %>以查看所有可用选项。

5

基于@AmNaN建议(详细信息):

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 
96

最简单的解决方案,我可以在2015年拿出(验证使用轨道4,但也应该使用Rails工作3)

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

request.url

Request的q若要获取路径,除了基本URL

0

你可以做request.env['REQUEST_URI']看到完整的请求的URI ..这将输出类似下面

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