ruby on rails - Pan rallado en Ruby sobre rieles
ruby-on-rails controller (7)
Estoy un poco inseguro acerca de mi solución de migas de pan. Los nombres y enlaces se definen en cada acción del controlador:
<a href="http://localhost:3000/">Home</a>
<% if defined? @l1_link %>
> <a href="<%= @l1_link%>"><%= @l1_name %></a>
<% if defined? @l2_link %>
> <a href="<%= @l2_link%>"><%= @l2_name %></a>
<% end %>
<% end %>
De esta manera puedo usar:
@l1_link = user_path()
Pregunta: Como no soy tan inteligente, ¿podría este tipo de sistema conducir a un desastre en algún lugar del camino? ¿Es esto (groseramente) ineficiente?
Aquí hay dos enfoques:
Una solución más flexible implementada en el controlador donde configura las rutas de navegación en el controlador: http://szeryf.wordpress.com/2008/06/13/easy-and-flexible-breadcrumbs-for-rails/
El menú Breadcrumbs es un patrón recurrente en la mayoría de las aplicaciones de Rails. Para resolver este problema, creé y lancé un plugin llamado breadcrumbs_on_rails .
Definís tus migas de pan en el controlador.
class MyController
add_breadcrumb "home", root_path
add_breadcrumb "my", my_path
def index
# ...
add_breadcrumb "index", index_path
end
end
y los representas en tu vista.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>untitled</title>
</head>
<body>
<%= render_breadcrumbs %>
</body>
</html>
Incluso si no quieres utilizar un complemento, te animo a que lo veas. Es de código abierto y puedes tener alguna idea para tu aplicación.
Esto es principalmente una cuestión de opinión, pero de todos modos:
- No querría tanta lógica en una vista. Probablemente todos lo hemos hecho, pero se ensucia rápidamente.
- El código no es seguro contra cambios futuros que afectan la profundidad del árbol.
- En lugar de las variables vinculadas
*_name
y*_link
, sugeriría usar objetos adecuados de todos modos, con alguna funcionalidadlink_to
.
Es posible que encuentre el Episodio 162 de Railscasts de interés para una buena solución que le permita
<% for page in @page.ancestors.reverse %>
<%= link_to h(page.name), page %> >
<% end %>
Hice un tenedor de gema crumble
. Tiene muy pocas opciones de configuración y parece abandonado, pero cuando intenté cambiar a breadcrumbs_on_rails
o gretel
, me di cuenta de que tenía que agregar muchas líneas a mis vistas o controladores (y tengo muchos), pero con problemas. Se almacena todo en un archivo de configuración. Si te gusta hacer algunos parches y prefieres la configuración en un solo lugar, creo que es la mejor solución.
Hice una gema llamada Gretel que es un complemento de Ruby on Rails para crear migas de pan. Las rutas de navegación se configuran en un archivo de configuración independiente y se seleccionan en la vista.
Ejemplo config/breadcrumbs.rb
:
crumb :root do
link "Home", root_path
end
crumb :projects do
link "Projects", projects_path
end
crumb :project do |project|
link project.name, project_path(project)
parent :projects
end
crumb :project_issues do |project|
link "Issues", project_issues_path(project)
parent :project, project
end
crumb :issue do |issue|
link issue.name, issue_path(issue)
parent :project_issues, issue.project
end
En su opinión:
<% breadcrumb :issue, @issue %>
En su aplicación / views / layouts / application.html.erb:
<%= breadcrumbs pretext: "You are here: " %>
No utilice ningún plugin sólo para migas de pan. Este enlace proporciona un método eficiente para generar migas de pan.
http://szeryf.wordpress.com/2008/06/13/easy-and-flexible-breadcrumbs-for-rails/
Aunque, es un post muy antiguo, todavía funciona.
También puedes usar Ariane http://github.com/simonc/ariane
Con él puedes generar cualquier tipo de ruta de navegación, como enlaces en un párrafo o como un ul / li :)
Si quieres algo específico, puedes crear tu propio renderizador.
Es bastante simple de usar, solo agrega esto en un before_filter
:
ariane.add ''Home'', root_path # in the app controller to have it everywhere
ariane.add ''Some Page'', some_path