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"
O, más elegantemente: request.path_info
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