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.
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.
Antworten:
So finden Sie die URI heraus:
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, dh 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
params[:controller]
und verfügbar params[:action]
. Außerhalb davon ist diese API nicht mehr verfügbar, wenn Sie die Route erkennen möchten. Es hat sich jetzt verschoben ActionDispatch::Routing
und ich habe recognize_path
es noch nicht ausprobiert .
request.path
, den aktuellen Pfad zu finden.
request.env['ORIGINAL_FULLPATH']
, um die möglichen Parameter in den Pfad aufzunehmen, siehe meine Antwort unten.
Wenn Sie versuchen, einen Sonderfall in einer Ansicht zu erstellen, können Sie Folgendes verwenden current_page?
:
<% if current_page?(:controller => 'users', :action => 'index') %>
... oder eine Aktion und 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 ein Controller als auch eine Aktion erforderlich sind, erstelle ich current_controller?
in ApplicationController eine Methode , wenn ich mich nur um den Controller kümmere :
def current_controller?(names)
names.include?(current_controller)
end
Und benutze es so:
<% if current_controller?('users') %>
... was auch mit mehreren Controllernamen funktioniert ...
<% if current_controller?(['users', 'comments']) %>
controller_name
und action_name
eignen sich auch für Helfer und Ansichten für solche Dinge.
Die einfachste Lösung, die ich 2015 finden kann (überprüft mit Rails 4, sollte aber auch mit Rails 3 funktionieren)
request.url
# => "http://localhost:3000/lists/7/items"
request.path
# => "/lists/7/items"
<form action="<%= request.path %>">
Du kannst das
Rails.application.routes.recognize_path "/your/path"
Es funktioniert bei mir in Rails 3.1.0.rc4
In Rails 3 können Sie über das Objekt Rails.application.routes auf das Objekt Rack :: Mount :: RouteSet zugreifen und dann die Erkennung direkt aufrufen
route, match, params = Rails.application.routes.set.recognize(controller.request)
Damit wird die erste (beste) Übereinstimmung erzielt. Die folgende Blockform durchläuft die übereinstimmenden Routen:
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 verspotten, um es an das Rack weiterzuleiten. Weitere Informationen finden Sie unter ActionController :: Routing :: Routes.recognize_path wie sie es machen.
undefined method 'recognize' for #<Journey::Routes:0x007f893dcfa648>
Basierend auf dem @ AmNaN-Vorschlag (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 zB in einem Navigationslayout aufrufen, um Listenelemente als aktiv zu markieren:
<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 users
und alerts
Routen current_page?
würde reichen:
current_page?(users_path)
current_page?(alerts_path)
Aber mit verschachtelten Routen und der Anforderung aller Aktionen eines Controllers (vergleichbar mit items
) current_controller?
war die bessere Methode für mich:
resources :users do
resources :items
end
Der erste Menüeintrag ist auf diese Weise für folgende Routen aktiv:
/users/x/items #index
/users/x/items/x #show
/users/x/items/new #new
/users/x/items/x/edit #edit
Oder eleganter: request.path_info
Quelle:
Rack-Dokumentation anfordern
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 gemäß Ihrem Kommentar unten einfach Folgendes tun:
private
def pre_process
self.controller_name # Will return "order"
self.controller_class_name # Will return "OrderController"
end
self.
in self.controller_name
undself.controller_class_name
Sollten Sie auch die Parameter benötigen :
current_fullpath = request.env ['ORIGINAL_FULLPATH'] # Wenn Sie http://example.com/my/test/path?param_n=N durchsuchen # dann zeigt current_fullpath auf "/ my / test / path? param_n = N"
Und denken Sie daran, dass Sie jederzeit <%= debug request.env %>
eine Ansicht aufrufen können , um alle verfügbaren Optionen anzuzeigen.
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).
Du kannst das:
def active_action?(controller)
'active' if controller.remove('/') == controller_name
end
Jetzt können Sie Folgendes verwenden:
<%= link_to users_path, class: "some-class #{active_action? users_path}" %>