如何在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>
对于users
和alerts
路线, 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