Ich muss die aktuelle Route in einem Filter in Rails kennen. Wie kann ich herausfinden, was es ist?
Ich mache REST Ressourcen und sehe keine benannten Routen.
Um herauszufinden, 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"
So ermitteln Sie die Route, d. H. Controller, Aktion und Parameter
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
Wenn Sie versuchen, einen bestimmten Fall in einer Ansicht zu berücksichtigen, können Sie current_page?
wie folgt verwenden:
<% if current_page?(:controller => 'users', :action => 'index') %>
... oder eine Aktion und eine Id ...
<% if current_page?(:controller => 'users', :action => 'show', :id => 1) %>
... oder eine benannte Route ...
<% if current_page?(users_path) %>
...und
<% if current_page?(user_path(1)) %>
Da current_page?
sowohl einen Controller als auch eine Aktion erfordert, erstelle ich in ApplicationController eine current_controller?
-Methode:
def current_controller?(names)
names.include?(current_controller)
end
Und benutze es so:
<% if current_controller?('users') %>
... was auch mit mehreren Controller-Namen funktioniert ...
<% if current_controller?(['users', 'comments']) %>
Einfachste Lösung, die ich 2015 finden kann (mit Rails 4 überprüft, sollte aber auch mit Rails 3 funktionieren)
request.url
# => "http://localhost:3000/lists/7/items"
request.path
# => "/lists/7/items"
Du kannst das
Rails.application.routes.recognize_path "/your/path"
Es funktioniert für mich in Rails 3.1.0.rc4
In Rails 3 können Sie über das Rails.application.routes -Objekt auf das Rack :: Mount :: RouteSet-Objekt zugreifen und dann die Erkennungsfunktion direkt aufrufen
route, match, params = Rails.application.routes.set.recognize(controller.request)
damit wird die erste (beste) Übereinstimmung erzielt. Die folgenden Blockformschleifen werden über die übereinstimmenden Routen durchlaufen:
Rails.application.routes.set.recognize(controller.request) do |r, m, p|
... do something here ...
end
sobald Sie die Route haben, können Sie den Routennamen über route.name abrufen. Wenn Sie den Routennamen für eine bestimmte URL und nicht den aktuellen Anforderungspfad abrufen müssen, müssen Sie ein gefälschtes Anforderungsobjekt für die Weitergabe an das Rack simulieren, indem Sie ActionController :: Routing :: Routes.recognize_path überprüfen wie sie es machen.
Basierend auf dem Vorschlag von @AmNaN (weitere Details):
class ApplicationController < ActionController::Base
def current_controller?(names)
names.include?(params[:controller]) unless params[:controller].blank? || false
end
helper_method :current_controller?
end
Jetzt können Sie es z. in einem Navigationslayout zum Markieren von Listenelementen als aktiv:
<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>
Für die Routen users
und alerts
wäre current_page?
ausreichend:
current_page?(users_path)
current_page?(alerts_path)
Bei verschachtelten Routen und der Anforderung aller Aktionen eines Controllers (vergleichbar mit items
) war current_controller?
die bessere Methode für mich:
resources :users do
resources :items
end
Der erste Menüeintrag ist auf diese Weise für die folgenden Routen aktiv:
/users/x/items #index
/users/x/items/x #show
/users/x/items/new #new
/users/x/items/x/edit #edit
Ich gehe davon aus, dass Sie die URI meinen:
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
Wenn Sie den Namen des Controllers benötigen, können Sie dies einfach wie folgt tun:
private
def pre_process
self.controller_name # Will return "order"
self.controller_class_name # Will return "OrderController"
end
Sollten Sie auch die Parameter benötigen :
current_fullpath = request.env ['ORIGINAL_FULLPATH'] # Wenn Sie http://example.com/my/test/path?param_n=N .__ /test/path?param_n=N"
Denken Sie daran, dass Sie in einer Ansicht jederzeit <%= debug request.env %>
aufrufen können, um alle verfügbaren Optionen anzuzeigen.
Oder eleganter: request.path_info
Quelle:
Rack-Dokumentation anfordern
request.url
request.path #, um den Pfad mit Ausnahme der Basis-URL abzurufen
Sie können alle Routen über Rake: Routen anzeigen (dies kann Ihnen helfen).
Sie können request.env['REQUEST_URI']
tun, um den vollständigen angeforderten URI anzuzeigen. Der folgende Befehl wird ausgegeben
http://localhost:3000/client/1/users/1?name=test
Du kannst das:
def active_action?(controller)
'active' if controller.remove('/') == controller_name
end
Jetzt können Sie so verwenden:
<%= link_to users_path, class: "some-class #{active_action? users_path}" %>