Rails에 대한 지루한 빵 부스러기

8478 단어 webdevrailsruby
이동 경로는 대부분의 소프트웨어 애플리케이션에서 공통적인 UI 패턴입니다. Rails에는 이동 경로 전용 도구가 내장되어 있지 않으며 there are a handful of existing gems 단 몇 줄의 코드만으로 자신의 앱에서 쉽게 구현할 수 있다고 생각합니다.

궁극적으로 앱에서 이동 경로를 표시하는 방법을 제어해야 하므로 이 기능에 대한 모든 코드를 소유하는 것이 좋습니다.

용법



먼저 Breadcrumb 에 대한 모델을 추가합니다. 이것은 app/models 폴더에 있을 수 있지만 데이터베이스에 유지할 필요가 없기 때문에 ActiveRecord 모델일 필요는 없습니다.

class Breadcrumb
  attr_reader :name, :path

  def initialize(name, path)
    @name = name
    @path = path
  end

  def link?
    @path.present?
  end
end


다음으로 이동 경로를 저장하고 추가하는 방법을 ApplicationController에 추가합니다.

class ApplicationController < ActionController::Base
  ...

  helper_method :breadcrumbs

  def breadcrumbs
    @breadcrumbs ||= []
  end

  def add_breadcrumb(name, path = nil)
    breadcrumbs << Breadcrumb.new(name, path)
  end
end


그런 다음 레이아웃에서 원하는 대로 이동 경로를 렌더링할 수 있습니다. 내 응용 프로그램에서는 <title> 헤드 태그와 페이지 머리글 모두에서 이동 경로를 사용합니다.

<head>
  <title>
    <%= breadcrumbs.map(&:name).reverse.append("My App").join(" | ") %>
  </title>
</head>

<nav>
  <ol class="breadcrumbs">
    <% breadcrumbs.each do |crumb| %>
     <li>
      <% if crumb.link? %>
        <%= link_to crumb.name, crumb.path, class: "breadcrumb-link" %>
      <% else %>
        <span class="breadcrumb-page">
          <%= crumb.name %>
        </span>
      <% end %>

      <% unless crumb == breadcrumbs.last %>
        <span class="breadcrumb-separator">/</span>
      <% end %>
     </li>
    <% end %>
  </ol>
</nav>


간단한 API이지만 이 모델을 사용하면 각 컨트롤러에 이동 경로를 추가할 수 있습니다. 이동 경로는 링크로 사용하려는 경우 옵션path을 포함할 수 있습니다.
before_actions 또는 각 작업 내부에 이동 경로를 설정할 수 있습니다. 일반 Ruby 코드와 마찬가지로 조건 논리를 추가할 수 있습니다.

class PostsController < ApplicationController
  before_action :set_breadcrumbs

  def index
    @posts = Post.all
  end

  def show
    @post = Post.find(params[:id])

    add_breadcrumb(@post.title, @post)
  end

  def new
    @post = Post.new

    add_breadcrumb("New Post")
  end

  private

  def set_breadcrumbs
    add_breadcrumb("Admin", admin_home_path) if Current.user.admin?
    add_breadcrumb("Posts", posts_path)
  end
end


섹시한? 아니. 지루해? 예. 잘 작동합니까? 물론.

좋은 웹페이지 즐겨찾기