Comment puis-je trouver le parcours actuel dans Rails?

J’ai besoin de connaître l’itinéraire actuel dans un filtre dans Rails. Comment puis-je savoir ce que c’est?

Je fais des ressources REST et je ne vois aucune route nommée.

Pour trouver l’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" 

Pour connaître l’itinéraire, c’est-à-dire le contrôleur, l’action et les parameters:

 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 

Si vous essayez de créer un cas particulier dans une vue, vous pouvez utiliser current_page? un péché:

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

… ou une action et un identifiant …

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

… ou une route nommée …

 < % if current_page?(users_path) %> 

…et

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

Parce que current_page? nécessite à la fois un contrôleur et une action, quand je me soucie seulement du contrôleur, je current_controller? un current_controller? méthode dans ApplicationController:

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

Et l’utiliser comme ça:

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

… qui fonctionne également avec plusieurs noms de contrôleurs …

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

La solution la plus simple que je puisse trouver en 2015 (vérifiée à l’aide de Rails 4, mais qui devrait également fonctionner avec Rails 3)

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

Tu peux le faire

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

Ca marche pour moi dans les rails 3.1.0.rc4

Dans les rails 3, vous pouvez accéder à l’object Rack :: Mount :: RouteSet via l’object Rails.application.routes, puis appeler directement sur celui-ci.

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

qui obtient la première correspondance (la meilleure), la forme de bloc suivante boucle sur les routes correspondantes:

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

Une fois que vous avez l’itinéraire, vous pouvez obtenir le nom de l’itinéraire via route.name. Si vous avez besoin d’obtenir le nom de la route pour une URL particulière, et non le chemin de la requête en cours, vous devrez simuler un object de demande falsifié pour le transmettre au rack, consultez ActionController :: Routing :: Routes.recognize_path pour voir comment ils le font

Basé sur la suggestion de @AmNaN (plus de détails):

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

Vous pouvez maintenant l'appeler, par exemple, dans une disposition de navigation pour marquer les éléments de la liste comme actifs:

  

Pour les routes des users et des alerts , current_page? serait suffisant:

  current_page?(users_path) current_page?(alerts_path) 

Mais avec des routes nestedes et des requêtes pour toutes les actions d'un contrôleur (comparable aux items ), current_controller? était la meilleure méthode pour moi:

  resources :users do resources :items end 

La première entrée de menu est active de cette façon pour les itinéraires suivants:

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

Je suppose que vous voulez dire l’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 

Selon votre commentaire ci-dessous, si vous avez besoin du nom du contrôleur, vous pouvez simplement faire ceci:

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

Si vous avez également besoin des parameters :

 current_fullpath = request.env ['ORIGINAL_FULLPATH']
 # Si vous naviguez sur http://example.com/my/test/path?param_n=N 
 # alors current_fullpath désignera "/ my / test / path? param_n = N"

Et rappelez-vous que vous pouvez toujours appeler < %= debug request.env %> dans une vue pour voir toutes les options disponibles.

Ou, plus élégamment: request.path_info

La source:
Demande de documentation sur le rack

request.url

request.path #pour obtenir le chemin sauf l’URL de base

Vous pouvez voir tous les itinéraires via rake: routes (cela pourrait vous aider).

Vous pouvez faire request.env['REQUEST_URI'] pour voir l’URI complète demandée.

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