web-dev-qa-db-fra.com

Comment puis-je connaître l'itinéraire 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 ne vois aucun itinéraire nommé.

191
luca

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 paramètres:

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
190
Swanand

Si vous essayez de mettre en casse quelque chose dans une vue, vous pouvez utiliser current_page? comme dans:

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

... ou une action et id ...

<% 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, lorsque je me soucie uniquement du contrôleur, je crée une méthode current_controller? dans ApplicationController:

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

Et utilisez-le comme ceci:

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

... qui fonctionne aussi avec plusieurs noms de contrôleurs ...

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

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

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

Tu peux le faire 

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

Cela fonctionne pour moi dans Rails 3.1.0.rc4

18
Lucas Renan

Dans Rails 3, vous pouvez accéder à l'objet Rack :: Mount :: RouteSet via l'objet Rails.application.routes, puis appeler directement le reconnaître.

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

qui obtient la première (meilleure) correspondance, la forme de bloc suivante boucle sur les itinéraires correspondants:

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 devez obtenir le nom de la route pour une URL particulière, et non le chemin de la requête en cours, vous devrez alors créer un objet de requête fictif pour le transmettre au rack, consultez ActionController :: Routing :: Routes.recognize_path pour afficher comment ils le font.

11
KinOfCain

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

Maintenant, vous pouvez l'appeler par exemple dans une présentation de navigation pour marquer les éléments de la liste comme actifs:

<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>

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

 current_page?(users_path)
 current_page?(alerts_path)

Mais avec les routes imbriquées et la demande de toutes les actions d'un contrôleur (comparable à items), current_controller? était la meilleure méthode pour moi:

 resources :users do 
  resources :items
 end

La première entrée de menu est ainsi active 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
6
neonmate

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 le faire:

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

Si vous avez également besoin des paramètres:

 current_fullpath = request.env ['ORIGINAL_FULLPATH'] 
 # # Si vous parcourez http://example.com/my/test/path?param_n=N 
 # current_fullpath pointe sur "/ mon /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.

4
Darme

Ou, plus élégamment: request.path_info

La source:
Demande de documentation sur le rack

4
dipole_moment

request.url

request.path #pour obtenir un chemin sauf l'URL de base

4
Charles Skariah

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

2
James Schorr

Vous pouvez faire request.env['REQUEST_URI'] pour voir l’URI complet demandé.

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

Tu peux le faire:

def active_action?(controller)
   'active' if controller.remove('/') == controller_name
end

Maintenant, vous pouvez utiliser comme ceci:

<%= link_to users_path, class: "some-class #{active_action? users_path}" %>
0
Tiago Cassio