it-swarm.com.de

Wie kann ich die aktuelle Route in Rails herausfinden?

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.

191
luca

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

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']) %>
273
IAmNaN

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"
116
weltschmerz

Du kannst das 

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

Es funktioniert für mich in Rails 3.1.0.rc4

18
Lucas Renan

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.

11
KinOfCain

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

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
4
Aaron Rustad

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.

4
Darme

Oder eleganter: request.path_info

Quelle:
Rack-Dokumentation anfordern

4
dipole_moment

request.url

request.path #, um den Pfad mit Ausnahme der Basis-URL abzurufen

4
Charles Skariah

Sie können alle Routen über Rake: Routen anzeigen (dies kann Ihnen helfen).

2
James Schorr

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

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}" %>
0
Tiago Cassio