template rails popper instalar framework bootstrap ruby-on-rails twitter-bootstrap twitter-bootstrap-rails

ruby-on-rails - popper - rails add bootstrap 4



Agregue dinĂ¡micamente clase activa a bootstrap li en Rails (7)

en la barra de navegación de bootstrap. Puede obtener el efecto de hacer clic en un botón agregando la clase active . Naturalmente, quiero usar esto en mis páginas. Por ejemplo, si estoy en la página sobre nosotros, queremos que se haga clic en el botón Acerca de nosotros.

¿Cuál es la mejor manera de hacerlo? Iba a ir a cada página y en la parte inferior tenía una función jQuery para agregarle la clase active . ¿Hay una mejor manera?


¿Por qué limitarse a solo li elementos? ¿Y por qué no es compatible con múltiples nombres de clase junto con active ? Esta solución me permite:

  • Admite no solo texto plano, sino HTML dentro de link_to (por ejemplo, agrega un icono dentro del enlace)
  • Agregue solo algunas líneas de código a application_helper.rb
  • Agregar active al nombre de clase completo del elemento de enlace en lugar de ser la única clase.

Entonces, agregue esto a application_helper.rb :

def active_class?(class_name = nil, path) class_name ||= "" class_name += " active" if current_page?(path) class_name.strip! return class_name end

Y en su plantilla puede tener algo como esto:

<div class="col-xs-3"> <%= link_to root_path, :class => active_class?("btn btn-outline-primary", root_path) do %> <i class="fa fa-list-alt fa-fw"></i> <% end %> </div>

También puede especificar o no un nombre de class_name y usarlo así:

<li class="<%= active_class?(root_path) %>">Home</li>

Gracias a las respuestas anteriores 1 , 2 y resources .


Lee sobre current_page? here

Puede agregar un método para manejar la lógica con current_page? , ejemplo, un método:

module ApplicationHelper def active_class(link_path) current_page?(link_path) ? "active" : "" end end

ejemplo de plantilla de barra de navegación bootstrap

<div class="navbar"> <div class="navbar-inner"> <a class="brand" href="#">Title</a> <ul class="nav"> <li class="active"><a href="#">Home</a></li> <li><a href="#">Link</a></li> <li><a href="#">Link</a></li> </ul> </div> </div>

Entonces, en vista se ve como

HTML

<li class="<%= active_class(some_path) %>"> <%= link_to "text of link", some_path %> </li>

HAML

%li{:class => active_class(some_path)} = link_to "text of link", some_path

O puede usar request.fullpath para obtener la ruta actual llena de ruta si una ruta actual tiene un parámetro

ejemplo

<ul> <% Contry.all.each do |c| %> <li class="snavitem <%= active_class(contry_path(c)) %>"> <%= link_to "show #{c.name}", contry_path(c) %> </li> <% end %> </ul>

y en su application_helper.rb

def active_class(link_path) request.fullpath == link_path ? "active" : "" end

lea sobre request.fullpath here


Para cualquiera que tenga problemas para dar sentido a esto, aquí hay un ejemplo con mis rutas y nombres de archivos establecidos explícitamente. Como una persona muy nueva a los rieles, estaba teniendo problemas para resolverlo. Gracias a las otras personas que respondieron anteriormente, ¡ya que me ayudó a resolverlo!

Coloqué la barra de navegación de Bootstrap en mi archivo application.html.erb:

<div class="navbar-header"> <a class="navbar-brand" href="/">Mapper</a> <ul class="nav navbar-nav"> <li class="<%= is_active?(''/'') %>"><%= link_to "Home", ''/'' %></li> <li class="<%= is_active?(''/main/map'') %>"><%= link_to "Map", ''/main/map'' %></li> <li class="<%= is_active?(''/main/about'') %>"><%= link_to "About", ''/main/about'' %></li> </ul> </div>

Esto va en el archivo application_helper.rb:

module ApplicationHelper def is_active?(link_path) current_page?(link_path) ? "active" : "" end end

¡Eso es! Ahora su aplicación agregará dinámicamente la clase ''activa'' a la página que esté viendo actualmente (es decir, su correspondiente elemento de lista en la barra de navegación). Esto es mucho más simple (y más SECO) que agregar la barra de navegación manualmente a cada página (ver) y luego actualizar la clase ''activa''.


Por favor intente esto en cada página, revise el cotrollero o acción y agregue el css

Por ejemplo:

<li class= <%= (controller.controller_name.eql?(''pages'') && controller.action_name.eql?(''index'') )? ''active'':''''%> ><%= link_to ''my page'', pages_path%></li>


Puede definir un método de ayuda en application_helper.rb

def create_link(text, path) class_name = current_page?(path) ? ''active'' : '''' content_tag(:li, class: class_name) do link_to text, path end end

Ahora puedes usar como:

create_link ''xyz'', any_path que se mostraría como <li class="active"><a href="/any">xyz</a></li>

¡Perfecto para la navegación de bootstrap!


Voy a publicar mi respuesta que creé sobre la base de estos otros porque en el caso de las vistas de CRUD la clase activa no se ha colocado.

module ApplicationHelper def active_class(name) controller_name.eql?(name) || current_page?(name) ? ''active'' : '''' end end

Mis puntos de vista usan algo como esto:

<ul class="nav navbar-nav"> <li class="nav-item <%= active_class(''/'') %>"> <a class="nav-link" href="/">Home</a> </li> <li class="nav-item <%= active_class(''leads'') %>"> <a class="nav-link" href="/leads">Leads</a> </li> </ul> <ul class="nav navbar-nav pull-right <%= active_class(edit_user_registration_path) %>"> <li class="nav-item "> <a class="nav-link" href="/users/edit">Perfil</a> </li> <li class="nav-item"> <%= link_to(''Sair'', destroy_user_session_path, method: :delete) %> </li> </ul>


en mi opinión, una manera más limpia de lograr eso es escribir un método link_to_in_li en application_helper.rb:

def link_to_in_li(body, url, html_options = {}) active = "active" if current_page?(url) content_tag :li, class: active do link_to body, url, html_options end end

entonces úsalo de esta manera

<%= link_to_in_li "Home", root_path, id: "home_link" %>

Encuentro que el código dentro de li un poco difícil de leer.