2010-02-17 7 views
17

No estoy seguro de mi solución de rastro de pan. Nombres y los enlaces se definen en cada acción del controlador:Pan rallado en Ruby on Rails

<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 llevaron a DESASTER algún lugar de la ¿la carretera? ¿Es esto (groseramente) ineficiente?

+0

Hola, gracias por las respuestas @Simone - Me gusta su solución, nunca pensé en SECAR moviendo la definición antes de mis acciones. Lo tomaré de inmediato. @Lolindrath - Sí, la división es agradable, sin embargo mi aplicación no es lo suficientemente limpia (y los nombres cambian, y i18n, etc ...) @Christopher: Tengo que verificar el episodio, no recibí la observación 3. (¿Por qué lleno ¿objetos soplados?), pero Nr. 2 es definitivamente algo en lo que necesito pensar. ¡Gracias! –

Respuesta

10

Esto es sobre todo una cuestión de opinión, pero de todos modos:

  1. No me gustaría que mucha lógica en una vista. Probablemente todos lo hayamos hecho, pero se ensucia rápidamente.
  2. El código no es seguro contra cambios futuros que afecten a la profundidad del árbol.
  3. En lugar de las variables vinculadas *_name y *_link, sugeriría utilizar objetos adecuados de todos modos, con alguna funcionalidad link_to.

Usted puede encontrar Episode 162 of Railscasts de interés para una buena solución que se las arregla con

<% for page in @page.ancestors.reverse %> 
    <%= link_to h(page.name), page %> &gt; 
<% end %> 
29

El menú de migas de pan es un patrón recurrente en la mayoría de las aplicaciones de Rails. Para resolver este problema, creé y lancé un complemento llamado breadcrumbs_on_rails.

a definir sus 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 que los hacen en su opinión.

<!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 desea utilizar un complemento, lo invito a que lo revise. Es de código abierto y puedes obtener alguna idea para tu aplicación.

+1

Esto es bueno, pero las migas de pan parecen una responsabilidad de vista en lugar de una responsabilidad de controlador. Recomiendo mover la llamada al método add_breadcrumb a su vista. – Ben

+6

También puede llamar al método en su controlador en su vista. El controlador le permite definir un nivel de navegación por controlador para reducir la duplicación de código en sus vistas. –

15

He hecho una gema llamada Gretel que es un plugin de Ruby on Rails para crear migas de pan. Las rutas de exploración se configuran en un archivo de configuración separado 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 app/views/layouts/application.html.erb:

<%= breadcrumbs pretext: "You are here: " %> 
+1

Gracias por la gema, intenté agregarla y obtuve esta "cantidad incorrecta de argumentos (1 por 0)". ¡Cualquier ayuda sería apreciada! Mejor, Alex –

1

También es posible usar Ariane http://github.com/simonc/ariane

Con él se puede generar cualquier tipo de miga de pan, como eslabones de un párrafo o como un ul/li :)

Si quieres algo específico, puede crear su propio renderizador.

Es muy sencillo de usar, sólo tiene que añadir esto en un before_filter:

ariane.add 'Home', root_path # in the app controller to have it everywhere 
ariane.add 'Some Page', some_path 
1

Hice un tenedor de crumble gema. Tiene muy pocas opciones de configuración y parece abandonado, pero cuando traté de 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 muchas de ellas), pero con crumble está todo almacenado en un archivo de configuración. Si desea hacer algunos parches y prefiere la configuración en un solo lugar, creo que es la mejor solución.