rutas rails ruby-on-rails ruby routing

ruby-on-rails - rutas - routes ruby on rails



¿Cómo puedo averiguar la ruta actual en Rails? (13)

Asumiré que te refieres a la 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

Según su comentario a continuación, si necesita el nombre del controlador, simplemente puede hacer esto:

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

Necesito saber la ruta actual en un filtro en Rails. ¿Cómo puedo saber qué es?

Estoy haciendo recursos REST, y no veo rutas con nombre.


Basado en la sugerencia de @AmNaN (más detalles):

class ApplicationController < ActionController::Base def current_controller?(names) names.include?(params[:controller]) unless params[:controller].blank? || false end helper_method :current_controller? end

Ahora puede llamarlo, por ejemplo, en un diseño de navegación para marcar los elementos de la lista como activos:

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

Para los users y rutas de alerts , current_page? seria suficiente:

current_page?(users_path) current_page?(alerts_path)

Pero con las rutas anidadas y la solicitud de todas las acciones de un controlador (comparables con los items ), current_controller? Fue el mejor método para mí:

resources :users do resources :items end

La primera entrada del menú es así activa para las siguientes rutas:

/users/x/items #index /users/x/items/x #show /users/x/items/new #new /users/x/items/x/edit #edit


En caso de necesitar también los parámetros :

current_fullpath = request.env[''ORIGINAL_FULLPATH''] # If you are browsing http://example.com/my/test/path?param_n=N # then current_fullpath will point to "/my/test/path?param_n=N"

Y recuerde que siempre puede llamar a <%= debug request.env %> en una vista para ver todas las opciones disponibles.


En los rieles 3 puede acceder al objeto Rack :: Mount :: RouteSet a través del objeto Rails.application.routes, y luego llamar a reconocerlo directamente

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

que obtiene la primera (mejor) coincidencia, la siguiente forma de bloque se desplaza sobre las rutas coincidentes:

Rails.application.routes.set.recognize(controller.request) do |r, m, p| ... do something here ... end

una vez que tenga la ruta, puede obtener el nombre de la ruta a través de route.name. Si necesita obtener el nombre de la ruta para una URL particular, no la ruta de solicitud actual, entonces deberá simular un objeto de solicitud falsa para pasar al bastidor, consulte ActionController :: Routing :: Routes.recognize_path para ver como lo estan haciendo


La solución más simple que puedo encontrar en 2015 (verificada con Rails 4, pero también debería funcionar con Rails 3)

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



Para averiguar la 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"

Para averiguar la ruta, es decir, controlador, acción y parámetros:

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


Puede hacer request.env[''REQUEST_URI''] para ver el URI solicitado completo ... se mostrará algo como abajo

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


Puede ver todas las rutas a través de rastrillo: rutas (esto podría ayudarle).


Puedes hacerlo

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

Funciona para mí en rieles 3.1.0.rc4


Puedes hacerlo:

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

Ahora, puedes usar así:

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


Si está intentando hacer un caso especial en una vista, puede usar current_page? como en:

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

... o una acción y una identificación ...

<% if current_page?(:controller => ''users'', :action => ''show'', :id => 1) %>

... o una ruta con nombre ...

<% if current_page?(users_path) %>

...y

<% if current_page?(user_path(1)) %>

Porque current_page? requiere tanto un controlador como una acción, cuando me importa solo el controlador ¿hago un current_controller? Método en ApplicationController:

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

Y úsalo así:

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

... que también funciona con múltiples nombres de controladores ...

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


request.url

request.path #para obtener ruta excepto la URL base