Динамическое меню ruby ​​на рельсах и частичное - PullRequest
2 голосов
/ 03 сентября 2011

Я довольно плохо знаком с рельсами и хотел бы помочь с реализацией динамического меню с использованием партиалов.

На данный момент мой код выглядит следующим образом:

частичное меню:

.three.columns
  %ul#nav

    %li{:class => @active_page=="about" ? "active_page" : ""}
      %a{:href => "../pages/about"} About
    %li{:class => @active_page=="careers" ? "active_page" : ""}
      %a{:href => "../pages/careers"} Careers
    %li{:class => @active_page=="contact" ? "active_page" : ""}
      %a{:href => "../pages/contact"} Contact

вид:

  html...
  = render :partial => 'shared/aboutmenu_nav'
  more html...

помощник по страницам:

def @active_page(c) 
controller.action_name == c 
end

Примечание: active_page - это класс, который я хотел бы передать li, если пользователь находится на соответствующей странице. Например, если пользователь находится на странице контактов, класс active_page будет передан только элементу Contact li.

Я пробовал несколько решений, включая создание нескольких версий CSS и передачу класса на body, соответствующего странице? например,

%body{:class => @page_name}

и затем определение @page_name в pages_helper следующим образом:

 def page_name
    @path.parameterize('_') unless @path.blank?
  end

Кажется, что ни одна из этих версий не работает, так как предыдущая (@active_page) не дает никаких результатов. Точно так же я не смог назначить класс для тега body - когда я проверял исходный код, тег body не имел классов.

Буду признателен за помощь в реализации динамического меню с использованием партиалов. Если есть метод, который я не попробовал, пожалуйста, не стесняйтесь сообщить мне. Я искренне благодарен за вашу помощь и очень благодарен за ваше время! Спасибо!

Использование решения Канадыда. На странице буквально отображается следующий текст, где должно появиться стилизованное меню:

<li class="">
<a href="/pages/about">About</a>
</li>
<li class="active_page">
<a href="/pages/careers">Careers</a>
</li>
<li class="">
<a href="/pages/contact">Contact</a>
</li>

Этот код был бы великолепен, если бы он был в исходном коде; однако, источник, кажется, не распознает это ... вместо этого исходный код показывает следующий код:

 &lt;li class=&quot;&quot;&gt;&lt;a href=&quot;/pages/about&quot;&gt;About&lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;active_page&quot;&gt;&lt;a href=&quot;/pages/careers&quot;&gt;Careers&lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;a href=&quot;/pages/contact&quot;&gt;Contact&lt;/a&gt;&lt;/li&gt;

Я подозреваю, что это может иметь какое-то отношение к интерпретации =top_menu в HAML?

1 Ответ

5 голосов
/ 03 сентября 2011

Добавьте эти методы к helpers/appalication_helper.rb

def active_menu?(path, path_right=request.path)
  (URI::parse(path).path == path_right) rescue false
end

def top_menu
  [
    "About",   "../pages/about", 
    "Careers", "../pages/careers", 
    "Contact", "../pages/contact"
  ].each_slice(2).map do |name, path|
    content_tag(:li, link_to(name, path), 
      :class => (active_menu?(path) ? "active_page" : ""))
  end.join('').html_safe
end

Теперь по вашему мнению:

.three.columns
  %ul#nav
    = top_menu

Примечание:

Используйте помощники маршрута для пути вместо жесткого кодирования их. Предполагая, что у вас есть контроллер с именем PagesController, вы можете переписать метод top_menu следующим образом:

def top_menu
  [
    "About",   about_pages_path, 
    "Careers", careers_pages_path, 
    "Contact", contact_pages_path
  ].each_slice(2).map do |name, path|
    content_tag(:li, link_to(name, path), 
      :class => (active_menu?(path) ? "active_page" : ""))
  end.join('').html_safe
end
...