Панировочные сухари в Ruby on Rails - PullRequest
17 голосов
/ 17 февраля 2010

Я немного неуверен в своем решении для хлебных крошек. Имена и ссылки определяются в каждом действии контроллера:

<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 %>

Таким образом, я могу использовать:

@l1_link = user_path()

Вопрос: Поскольку я не настолько умен, может ли такая система привести к катастрофе где-нибудь в будущем? Это (грубо) неэффективно?

Ответы [ 7 ]

29 голосов
/ 17 февраля 2010

Меню Breadcrumbs - это повторяющийся шаблон в большинстве приложений Rails. Чтобы решить эту проблему, я создал и выпустил плагин с именем breadcrumbs_on_rails .

Вы определяете свои сухари в контроллере

class MyController

  add_breadcrumb "home", root_path
  add_breadcrumb "my", my_path

  def index
    # ...

    add_breadcrumb "index", index_path
  end

end

и вы отображаете их в своем представлении.

<!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>

Даже если вы не хотите использовать плагин, я призываю вас взглянуть на него. Это открытый исходный код, и вы можете получить некоторые идеи для вашего приложения.

15 голосов
/ 30 октября 2010

Я создал гем с именем Гретель , который является плагином Ruby on Rails для создания хлебных крошек. Панировочные сухари настраиваются в отдельном файле конфигурации и выбираются в представлении.

Пример 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

На ваш взгляд:

<% breadcrumb :issue, @issue %>

В вашем приложении / views / layouts / application.html.erb:

<%= breadcrumbs pretext: "You are here: " %>
10 голосов
/ 17 февраля 2010

Это в основном вопрос мнения, но в любом случае:

  1. Я бы не хотел так много логики в представлении. Мы, наверное, все это сделали, но все быстро запуталось.
  2. Код не защищен от будущих изменений, которые влияют на глубину дерева.
  3. Вместо связанных переменных *_name и *_link я бы в любом случае предложил использовать правильные объекты с некоторыми link_to функциональными возможностями.

Вы можете найти Эпизод 162 Railscasts , представляющий интерес для хорошего решения, которое обойдется с

<% for page in @page.ancestors.reverse %>
  <%= link_to h(page.name), page %> &gt;
<% end %>
5 голосов
/ 25 июня 2012

Не используйте никакие плагины только для панировочных сухарей.Эта ссылка предоставляет эффективный метод для генерации панировочных сухарей.

http://szeryf.wordpress.com/2008/06/13/easy-and-flexible-breadcrumbs-for-rails/

Хотя это очень старый пост, он все еще работает.

2 голосов
/ 17 февраля 2010

Вот два подхода:

Разделить URL и отобразить его

Более гибкое решение, реализованное в контроллере, где вы настраиваете хлебные крошки в контроллере: Простые и гибкие хлебные крошки для рельсов

1 голос
/ 17 августа 2016

Я сделал вилку из crumble драгоценного камня. У него очень мало вариантов конфигурации, и он кажется заброшенным, но когда я попытался переключиться на breadcrumbs_on_rails или gretel, я понял, что мне нужно добавить много строк в мои представления или контроллеры (и у меня их много), но с crumble все это хранится в одном файле конфигурации. Если вам нравится делать некоторые исправления и предпочитать настройку в одном месте, я думаю, что это лучшее решение из всех.

1 голос
/ 16 марта 2012

Вы также можете использовать Ariane http://github.com/simonc/ariane

С его помощью вы можете создавать любые виды хлебных крошек, как ссылки в абзаце или как ul / li:)

Если вы хотите что-то конкретное, вы можете создать свой собственный рендерер.

Это довольно просто использовать, просто добавьте это в before_filter:

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