Eu tenho algumas páginas estáticas em um menu de navegação. Quero adicionar uma classe como "atual" ao item que está sendo exibido no momento.
A forma como estou fazendo isso é adicionar toneladas de métodos auxiliares (cada um para um item) para verificar o controlador e a ação.
def current_root_class
'class="current"' if controller_name == "homepage" && action_name == "index"
end
<ul>
<li <%= current_root_class %>><%= link_to "Home", root_path %>
Existe alguma maneira melhor de fazer isso !? Meu jeito atual é tão estúpido ...
navigation
ruby-on-rails-3
PeterWong
fonte
fonte
controller_name
e emaction_name
vez de parâmetros provavelmenteEu fiz um ajudante chamado
nav_link
:usado como:
que irá produzir HTML como
fonte
Use o
current_page?
auxiliar para determinar se você deve ou não atribuir a"current"
classe. Por exemplo:Note que você também pode passar um caminho (não somente um hash de opções), por exemplo:
current_page?(root_path)
.fonte
Eu uso esta função nav_link (texto, link) em application_helper.rb (Rails 3) para fazer o trabalho e ela rola meus links de bootstrap da barra de navegação do Twitter 2.0 para mim.
Exemplo:
fonte
current_page?
método, como em outras respostas.A forma como fiz isso é adicionar uma função auxiliar no application_helper
Então, na navegação,
Isso testa o caminho do link contra o uri da página atual e retorna sua classe atual ou uma string vazia.
Eu não testei isso completamente e sou muito novo no RoR (mudando depois de uma década com o PHP), então, se houver uma grande falha, adoraria ouvi-la.
Pelo menos assim você só precisa de 1 função auxiliar e uma chamada simples em cada link.
fonte
Para construir a resposta de @Skilldrick ...
Se você adicionar este código ao application.js, ele garantirá que todos os menus suspensos com filhos ativos também sejam marcados como ativos ...
Para recapitular o código de suporte> Adicione um auxiliar chamado nav_link:
usado como:
que irá produzir HTML como
fonte
Eu acho que a melhor maneira é
application_helper.rb:
E no menu:
fonte
<%= content_tag(:li, "Click me", class: is_active('controller', 'action')) %>
, ele não imprimirá um atributo de classe para nil. apidock.com/rails/ActionView/Helpers/TagHelper/content_tagEu sei que é uma resposta desatualizada, mas você pode facilmente ignorar todas as verificações da página atual usando um link_to helper wrapper, chamado active_link_to gem, funciona exatamente como você deseja, adicione uma classe ativa ao link da página atual
fonte
Aqui está o exemplo completo, sobre como adicionar uma classe ativa na página do menu de bootstrap na visualização rails.
fonte
Eu uso uma joia incrível chamada Tabs on Rails .
fonte
Eu tenho uma versão mais sucinta de nav_link que funciona exatamente como link_to, mas é personalizado para gerar uma tag li envolvente.
Coloque o seguinte em seu application_helper.rb
Se você olhar o código acima e compará-lo com o código link_to em url_helper.rb, a única diferença é que ele verifica se o url é a página atual e adiciona a classe "ativa" a uma tag li envolvente. Isso ocorre porque estou usando o auxiliar nav_link com o componente nav do Twitter Bootstrap, que prefere que os links sejam agrupados dentro de tags li e a classe "ativa" aplicada ao li externo.
O bom do código acima é que ele permite que você passe um bloco para a função, assim como você pode fazer com link_to.
Por exemplo, uma lista de navegação bootstrap com ícones se pareceria com:
Fino:
Resultado:
Além disso, assim como o helper link_to, você pode passar opções de HTML para nav_link, que será aplicado a uma tag.
Um exemplo de passagem de um título para a âncora:
Fino:
Resultado:
fonte
Para mim, pessoalmente, usei uma combinação de respostas aqui
Estou usando materialize css e minha maneira de tornar as categorias principais recolhíveis é usando o código abaixo
espero que ajude alguém
fonte
O
current_page?
método não é flexível o suficiente para mim (digamos que você defina um controlador, mas não uma ação, então ele só retornará verdadeiro na ação de índice do controlador), então fiz isso com base nas outras respostas:Exemplo:
fonte
Sim! Confira este artigo: Uma maneira melhor de adicionar uma classe 'selecionada' aos links no Rails
Solte nav_link_helper.rb em app / helpers e pode ser tão fácil quanto:
O auxiliar nav_link funciona como o helper link_to padrão do Rails, mas adiciona uma classe 'selecionada' ao seu link (ou seu wrapper) se certos critérios forem atendidos. Por padrão, se o url de destino do link for o mesmo url da página atual, uma classe padrão 'selecionado' é adicionada ao link.
Há uma essência aqui: https://gist.github.com/3279194
ATUALIZAÇÃO: agora é uma joia: http://rubygems.org/gems/nav_link_to
fonte
Eu uso um auxiliar simples como este para links de nível superior para que a
/stories/my-story
página destaque o/stories
linkfonte
Deixe-me mostrar minha solução:
_header.html.erb :
application_helper.rb :
application_controller.rb :
fonte
De acordo com a resposta de Skilldrick , vou mudar para o seguinte:
para torná-lo muito mais útil.
fonte
Esta versão é baseada na de @ Skilldrick, mas permite adicionar conteúdo html.
Assim, você pode fazer:
nav_link "A Page", a_page_path
mas também:
ou qualquer outro conteúdo html (você pode adicionar um ícone, por exemplo).
Aqui, o ajudante é:
fonte
Acho que encontrei uma solução simples que pode ser útil para muitos casos de uso. Isso me permite:
link_to
(por exemplo, adicionar um ícone dentro do link)application_helper.rb
active
ao nome da classe inteira do elemento de link em vez de ser a única classe.Então, adicione isso a
application_helper.rb
:E em seu modelo, você pode ter algo assim:
Como bônus você pode especificar ou não um
class_name
e usá-lo assim:<div class="<%= current_page?(root_path) %>">
Graças às respostas anteriores 1 , 2 e recursos .
fonte
tudo isso funciona com barras de navegação simples, mas e o submenu suspenso? quando um sub-menu é selecionado o item do menu superior deve ser tornado 'atual' neste caso tabs_on_rails me ser a solução
fonte
Foi assim que resolvi no meu projeto atual.
Então..
fonte
Meu jeito fácil -
application.html.erb
,main_controller.erb
,Obrigado.
fonte
Se você também deseja oferecer suporte a opções de hash html na visualização. Por exemplo, se você deseja chamá-lo com outra classe CSS ou id, você pode definir a função auxiliar desta forma.
Então, na view, chame este helper da mesma forma que você chamaria link_to helper
fonte
Crie um método
ApplicationHelper
conforme abaixo.Agora use-o para ver os casos de uso abaixo.
1. Para todas as ações de qualquer controlador específico
2. Para todas as ações de muitos controladores (com vírgula separada)
3. Para ação específica de qualquer controlador específico
4. Para ação específica de muitos controladores (com vírgula separada)
5. Para algumas ações específicas de qualquer controlador específico
6. Para algumas ações específicas de muitos controladores (com vírgulas separadas)
Espero que ajude
fonte