ruby-on-rails - sesiones - bootstrap modal rails 5
¿Cómo implemento la navegación específica de la sección en Ruby on Rails? (9)
Tengo una aplicación Ruby / Rails que tiene dos o tres "secciones" principales. Cuando un usuario visita esa sección, deseo mostrar algo de navegación secundaria. Las tres secciones usan el mismo diseño, por lo que no puedo "codificar" la navegación en el diseño.
Puedo pensar en algunos métodos diferentes para hacer esto. Supongo que para ayudar a las personas a votar las incluiré como respuestas.
¿Alguna otra idea? ¿O por qué votas?
- Render parcial Esto es muy similar al método de ayuda, excepto que quizás el diseño tenga algunos enunciados if, o los pase a un ayudante ...
En cuanto al contenido de sus submenús, puede verlo de manera declarativa en cada controlador.
class PostsController < ApplicationController
#...
protected
helper_method :menu_items
def menu_items
[
[''Submenu 1'', url_for(me)],
[''Submenu 2'', url_for(you)]
]
end
end
Ahora, cada vez que llame a menu_items desde una vista, tendrá la lista correcta para iterar para el controlador específico.
Esto me parece una solución más limpia que poner esta lógica dentro de las plantillas de vista.
Tenga en cuenta que también puede declarar un menú de menú predeterminado (¿vacío?) Dentro de ApplicationController también.
Puede usar algo como el complemento de navegación en http://rpheath.com/posts/309-rails-plugin-navigation-helper
No lleva a cabo una navegación por debajo de la caja, pero con un pequeño ajuste probablemente podría configurarse para hacer algo similar.
Te sugiero que uses parciales. Hay algunas maneras en que puede hacerlo. Cuando creo parciales que son un poco quisquillosos porque necesitan variables específicas, también creo un método de ayuda para ello.
module RenderHelper
#options: a nested array of menu names and their corresponding url
def render_submenu(menu_items=[[]])
render :partial => ''shared/submenu'', :locals => {:menu_items => menu_items}
end
end
Ahora el parcial tiene una variable local llamada menu_items sobre la cual puede iterar para crear su submenú. Tenga en cuenta que sugiero un conjunto anidado en lugar de un hash porque el orden de un hash es impredecible.
Tenga en cuenta que la lógica de decidir qué elementos se deben mostrar en el menú también podría estar dentro de render_submenu si tiene más sentido para usted.
Advertencia: ¡Trucos avanzados adelante!
Ríndelos todos . Oculte los que no necesita con CSS / Javascript, que pueden inicializarse trivialmente de muchas maneras. (Javascript puede leer la URL utilizada, los parámetros de consulta, algo en una cookie, etc.). Esto tiene la ventaja de poder jugar mucho mejor con su caché (¿por qué almacenar en caché tres vistas y luego caducar todas simultáneamente cuando puede caché uno? ?), y se puede utilizar para presentar una mejor experiencia de usuario.
Por ejemplo , supongamos que tiene una interfaz de barra de pestañas común con navegación secundaria. Si representa el contenido de las tres pestañas (es decir, está escrito en el HTML) y esconde dos de ellas, cambiar entre dos pestañas es un Javascript trivial y ni siquiera llega a su servidor . ¡Gran victoria! Sin latencia para el usuario. Sin carga de servidor para ti
¿Quieres otra gran victoria ? Puede usar una variación de esta técnica para hacer trampa en páginas que podrían ser 99% comunes en todos los usuarios pero que aún contienen el estado del usuario. Por ejemplo, puede tener una página de inicio de un sitio que es relativamente común para todos los usuarios, pero diga "Hiya Bob" cuando están conectados. Coloque la parte no común ("Hiya, Bob") en una cookie. Haga que esa parte de la página se lea en Javascript leyendo la cookie. Guarde en caché toda la página para todos los usuarios independientemente del estado de inicio de sesión en el almacenamiento en caché de página. Esto es literalmente capaz de cortar el 70% de los accesos de toda la pila de Rails en algunos sitios.
A quién le importa si Rails puede escalar o no cuando su sitio es realmente Nginx sirviendo a los activos estáticos con páginas HTML nuevas que ocasionalmente se entregan ejecutando Ruby cada millar de acceso más o menos;)
Hay otra forma posible de hacerlo: distribuciones anidadas
No recuerdo dónde encontré este código así que le pido disculpas al autor original.
crea un archivo llamado nested_layouts.rb en tu carpeta lib e incluye el siguiente código:
module NestedLayouts
def render(options = nil, &block)
if options
if options[:layout].is_a?(Array)
layouts = options.delete(:layout)
options[:layout] = layouts.pop
inner_layout = layouts.shift
options[:text] = layouts.inject(render_to_string(options.merge({:layout=>inner_layout}))) do |output,layout|
render_to_string(options.merge({:text => output, :layout => layout}))
end
end
end
super
end
end
luego, cree sus diversos diseños en la carpeta de diseños, (por ejemplo, ''admin.rhtml'' y ''application.rhtml'').
Ahora en sus controladores agregue esto solo dentro de la clase:
include NestedLayouts
Y finalmente al final de tus acciones haz esto:
def show
...
render :layout => [''admin'',''application'']
end
el orden de los diseños en la matriz es importante. El diseño del administrador se representará dentro del diseño de la aplicación dondequiera que esté el ''yeild''.
este método puede funcionar realmente bien dependiendo del diseño del sitio y cómo se organizan los diversos elementos. por ejemplo, uno de los diseños incluidos podría contener una serie de divs que contienen el contenido que debe mostrarse para una acción en particular, y el CSS en un diseño más alto podría controlar dónde están posicionados.
Puedes hacerlo fácilmente usando parciales, asumiendo que cada sección tenga su propio controlador.
Supongamos que tiene tres secciones llamadas Publicaciones , Usuarios y Administrador , cada una con su propio controlador: Controlador de PostsController
, UsersController
y UsersController
.
En cada directorio de views
correspondiente, declaras un _subnav.html.erb
parcial:
/app/views/users/_subnav.html.erb /app/views/posts/_subnav.html.erb /app/views/admin/_subnav.html.erb
En cada uno de estos parciales subnav declaras las opciones específicas de esa sección, para que /users/_subnav.html.erb
pueda contener:
<ul id="subnav">
<li><%= link_to ''All Users'', users_path %></li>
<li><%= link_to ''New User'', new_user_path %></li>
</ul>
Mientras que /posts/_subnav.html.erb
puede contener:
<ul id="subnav">
<li><%= link_to ''All Posts'', posts_path %></li>
<li><%= link_to ''New Post'', new_post_path %></li>
</ul>
Finalmente, una vez que haya hecho esto, solo necesita incluir el subnav parcial en el diseño:
<div id="header">...</div>
<%= render :partial => "subnav" %>
<div id="content"><%= yield %></div>
<div id="footer">...</div>
Hay pocos enfoques para este problema.
Es posible que desee utilizar diferentes diseños para cada sección.
Es posible que desee utilizar un parcial incluido por todas las vistas en un directorio determinado.
Es posible que desee utilizar content_for
que se completa mediante una vista o un parcial, y se llama en el diseño global, si tiene uno.
Personalmente, creo que deberías evitar más abstracción en este caso.
Pregunté más o menos la misma pregunta: ¿ Necesito consejo: vistas de Structure of Rails para los submenus? La mejor solución fue probablemente usar parciales.