ruby-on-rails - route - ruby on rails def create




Como posso descobrir a rota atual no Rails? (9)

A solução mais simples que eu posso encontrar em 2015 (verificada usando o Rails 4, mas também deve funcionar usando o Rails 3)

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

Eu preciso saber a rota atual em um filtro no Rails. Como posso descobrir o que é isso?

Eu estou fazendo recursos REST e não vejo rotas nomeadas.


Baseado na sugestão @AmNaN (mais detalhes):

class ApplicationController < ActionController::Base

 def current_controller?(names)
  names.include?(params[:controller]) unless params[:controller].blank? || false
 end

 helper_method :current_controller?

end

Agora você pode chamá-lo, por exemplo, em um layout de navegação para marcar os itens da lista como ativos:

<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 os users e rotas de alerts , current_page? seria o suficiente:

 current_page?(users_path)
 current_page?(alerts_path)

Mas com rotas aninhadas e solicitação para todas as ações de um controlador (comparável com items ), current_controller? foi o melhor método para mim:

 resources :users do 
  resources :items
 end

A primeira entrada do menu é ativa para as seguintes rotas:

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

No rails 3 você pode acessar o objeto Rack :: Mount :: RouteSet através do objeto Rails.application.routes, e chamar reconhecê-lo diretamente

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

que obtém a primeira correspondência (melhor), o formulário de bloco a seguir percorre as rotas correspondentes:

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

depois de ter a rota, você pode obter o nome da rota via route.name. Se você precisar obter o nome da rota para uma URL específica, não o caminho da solicitação atual, será necessário simular um objeto de solicitação falsa para passar para rack, confira ActionController :: Routing :: Routes.recognize_path para ver como eles estão fazendo isso.



Se você está tentando algo especial em uma exibição, pode usar current_page? como em:

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

... ou uma ação e id ...

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

... ou uma rota nomeada ...

<% if current_page?(users_path) %>

...e

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

Porque current_page? requer um controlador e uma ação, quando eu me importo apenas com o controlador eu faço um current_controller? método em ApplicationController:

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

E usá-lo assim:

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

... que também funciona com vários nomes de controladores ...

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

Se você também precisar dos 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"

E lembre-se de que você sempre pode chamar <%= debug request.env %> em uma visualização para ver todas as opções disponíveis.


Você consegue fazer isso:

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

Agora você pode usar assim:

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

Você pode fazer request.env['REQUEST_URI'] para ver o URI solicitado.

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

request.url

request.path #to caminho, exceto o URL base





routing