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é.
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
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']) %>
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"
Tu peux le faire
Rails.application.routes.recognize_path "/your/path"
Cela fonctionne pour moi dans Rails 3.1.0.rc4
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.
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
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
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.
Ou, plus élégamment: request.path_info
La source:
Demande de documentation sur le rack
request.url
request.path #pour obtenir un 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 complet demandé.
http://localhost:3000/client/1/users/1?name=test
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}" %>