Легкие панировочные сухари для применения на рельсах RESTful - PullRequest
2 голосов
/ 17 февраля 2009

Существует ли какой-либо вспомогательный метод (кроме default rails breadcrumb ), который динамически генерирует навигацию по крошкам для конкретной страницы без необходимости передавать тривиальные параметры в приложении RESTful? То есть что-то, что автоматически выясняет, где пользователь основан на REST-URL, который он посещает?

Для вышеупомянутой реализации нам нужно передать такие параметры, как

REST

<% add_crumb(‘Profile’, user_profile_path) %>

Текущая страница

<% add_crumb(“My Incoming Messages”, request.path) %>

Должен быть способ обобщения кода, чтобы не требовалось передавать параметры, и он должен работать для всех приложений RESTful с минимальной конфигурацией.

Ответы [ 2 ]

4 голосов
/ 17 февраля 2009

Разработан простой хак. Однако метод предполагает, что существует метод name для каждого объекта модели, соответствующего каждому ресурсу в URL-адресе RESTful. Независимо от того, что возвращает метод name, он отображается как имя крошки. Если он не найден, он отображается как есть без ссылки на что-либо. Используется разделитель «->». Вы можете изменить его в соответствии с вашими требованиями.

def get_bread_crumb(url)
  begin
    breadcrumb = ''
    sofar = '/'
    elements = url.split('/')
    for i in 1...elements.size
      sofar += elements[i] + '/'
      if i%2 == 0
        begin
          breadcrumb += "<a href='#{sofar}'>"  + eval("#{elements[i - 1].singularize.camelize}.find(#{elements[i]}).name").to_s + '</a>'
        rescue
          breadcrumb += elements[i]
        end
      else
        breadcrumb += "<a href='#{sofar}'>#{elements[i].pluralize}</a>"
      end
      breadcrumb += ' -> ' if i != elements.size - 1
    end
    breadcrumb
  rescue
    'Not available'
  end
end

Метод обычно принимает request.url (который задал URL-адрес текущей страницы) в качестве параметра. Метод целенаправленно принимает URL для настройки. Чтобы создать крошку, просто добавьте следующий код в вашем представлении -

<%= get_bread_crumb(request.url) %>

Для URL /ideabox/2/idea/1 хлебная крошка выглядит как

альтернативный текст http://www.imagechicken.com/uploads/1234855404069992300.png

Извините, если качество кода не настолько велико. Я уверен, что этот код может быть переработан, но я также уверен, что вы сможете сделать это перед его использованием.

Спасибо.

0 голосов
/ 17 июля 2014

Решение, предоставленное хирантаном, великолепно. Если вам нужны breabcrumbs для контроллера пространства имен и вам нужно также изменить breadcrumbs в зависимости от пространства имен, попробуйте это Это не идеально, но рефакторинг, как вам нужно. Это работает для моего проекта.

Определите нового помощника: navigation_helper.rb

module NavigationHelper

  def navigation_add(title, url, namespace)

    if defined? @@namespace and !@@namespace.nil? and @@namespace == namespace
      @@navigation ||= []
    else
      @@navigation = []
    end

    @@navigation << {title: title, url: url} unless title == "Home"

    new_nav = []
    @@navigation.each do |hash|
      new_nav.push hash
      if hash[:title].to_s == title.to_s
        break
      end
    end

    @@navigation = new_nav
    @@navigation.uniq!
    @@namespace = namespace
  end

  def render_navigation
    if (request.path_parameters[:controller].sub('/', '::_').camelize + 'Controller').classify.constantize.action_methods.to_a.include? 'index'
      navigation_add controller_name.camelize.to_s, request.path_parameters.merge({action: 'index'}).except(:id), params[:controller].include?('/') ? params[:controller].split("/").first : nil
    end
    if defined? @@navigation
      render partial: 'navigation/navigation', locals: { navs: @@navigation, namespace: @@namespace }
    else
      render text: ''
    end
  end
end

Затем определите представление для этого помощника _navigation.haml

- unless navs.blank?

  %ol.breadcrumb

    - navs.each_with_index do |nav, index|

      - if index == 0

        %li=link_to fa_icon('arrow-left', text: 'Go Back'), :back

        - unless namespace.nil?

          %li

            %h4.inline= request.fullpath.split('/')[1].gsub('-', '_').camelize

            = fa_icon('angle-double-right')

      %li= link_to_unless (nav[:title] == controller_name.camelize and action_name == 'index'),  fa_icon(nav[:title].downcase.singularize, text: nav[:title]), nav[:url]
...