Breadcrumbs in Ruby on Rails

前端 未结 6 851
猫巷女王i
猫巷女王i 2021-02-01 07:02

I\'m slightly insecure about my breadcrumb solution. Names and links are defined in each controller action:

Home

        
相关标签:
6条回答
  • 2021-02-01 07:36

    Breadcrumbs menu are a recurrent pattern in most Rails applications. To solve this issue, I created and released a plugin called breadcrumbs_on_rails.

    You define your breadcrumbs in the controller

    class MyController
    
      add_breadcrumb "home", root_path
      add_breadcrumb "my", my_path
    
      def index
        # ...
    
        add_breadcrumb "index", index_path
      end
    
    end
    

    and you render them in your view.

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

    Even if you don't want to use a plugin, I encourage you to give it a look. It's open source and you can grab some idea for your app.

    0 讨论(0)
  • 2021-02-01 07:38

    Do not use any plugins just for breadcrumbs. This link provides an efficient method to generate breadcrumbs.

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

    Although, it is a very old post, it still works.

    0 讨论(0)
  • 2021-02-01 07:40

    I made a gem named Gretel that is a Ruby on Rails plugin for creating breadcrumbs. The breadcrumbs are configured in a separate configuration file and selected in the view.

    Example 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
    

    In your view:

    <% breadcrumb :issue, @issue %>
    

    In your app/views/layouts/application.html.erb:

    <%= breadcrumbs pretext: "You are here: " %>
    
    0 讨论(0)
  • 2021-02-01 07:46

    This is mostly a matter of opinion, but anyway:

    1. I would not want that much logic in a view. We've probably all done it, but it gets messy quickly.
    2. The code is not safe against future changes that affect the depth of the tree.
    3. Instead of linked variables *_name and *_link, I'd suggest using proper objects anyway, with some link_to functionality.

    You might find Episode 162 of Railscasts of interest for a nice solution that gets by with

    <% for page in @page.ancestors.reverse %>
      <%= link_to h(page.name), page %> &gt;
    <% end %>
    
    0 讨论(0)
  • 2021-02-01 07:49

    You could also use Ariane http://github.com/simonc/ariane

    With it you can generate any kind of breadcrumb, as links in a paragraph or as a ul/li :)

    If you want something specific, you can create your own renderer.

    It's pretty simple to use, just add this in a before_filter:

    ariane.add 'Home', root_path # in the app controller to have it everywhere
    ariane.add 'Some Page', some_path
    
    0 讨论(0)
  • 2021-02-01 07:58

    I did a fork of crumble gem. It has very few configuration options and it appears abandoned, but when I tried to switch to breadcrumbs_on_rails or gretel, I realized that I have to add many lines to my views or controllers (and I have a lot of them), but with crumble it is all stored in one configuration file. If you like to do some patches and prefer configuration in one place, I think it is the best solution ever.

    0 讨论(0)
提交回复
热议问题