Динамическое меню ruby ​​on rails и частичное

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

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

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

.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?


person slovak_100    schedule 03.09.2011    source источник


Ответы (1)


Добавьте эти методы в 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
person Harish Shetty    schedule 03.09.2011
comment
Спасибо за ваше предложение, Кандада... Последний набор кода, он относится к PagesController, как в pages_controller.rb, или к файлу маршрута? - person slovak_100; 03.09.2011
comment
Обновлен мой ответ, посмотрите. - person Harish Shetty; 03.09.2011
comment
Спасибо за новость, Кандада! Однако, когда я использую предложение выше, раздел не стилизуется... страница просто отображает: ‹li class=›‹a href=../pages/about›About‹/a›‹/li›‹li class= ›‹a href=../pages/careers›Карьера‹/a›‹/li›‹li class=›‹a href=../pages/contact›Контакты‹/a›‹/li› - person slovak_100; 04.09.2011
comment
Не используйте относительный путь. Используйте второй подход, который я предложил. Я использую это решение все время. Работает без проблем. - person Harish Shetty; 04.09.2011
comment
Я не уверен, что вы имеете в виду относительный путь. Я пробовал ваш код, и он не работает. Я сделал именно так, как описано выше. Нужно ли мне иметь что-то конкретное в файле маршрутов? Кроме того, я использую HighVoltage для своих статических страниц... может ли это быть причиной проблемы? - person slovak_100; 04.09.2011
comment
Используйте about_pages_path вместо ../pages/about. Если вы все еще сталкиваетесь с ошибками, напечатайте параметры метода active_menu?. Добавьте строку puts path, path_right в начало метода. Значения будут напечатаны в консоли сервера. Это должно помочь вам отладить проблему. - person Harish Shetty; 04.09.2011
comment
я добавил путь puts, path_right и вот мой вывод: ../pages/about /pages/careers ../pages/careers /pages/careers ../pages/contact /pages/careers также, должен ли я включить код для application_helper.rb И pagescontroller.rb или только для одного из них? - person slovak_100; 04.09.2011
comment
Проблема в том, что вы используете относительные пути. Измените пути, используемые во вспомогательном файле, с ../pages/about на /pages/about. Сделайте это изменение для каждого пункта меню, и оно будет работать. - person Harish Shetty; 04.09.2011
comment
Канадада... большое спасибо за вашу помощь. Я так благодарен! У меня есть одна проблема... на странице отображается код вместо желаемого вывода... это означает, что страница фактически показывает: ‹li class=›‹a href=../pages/about›About‹/a›‹/ li›‹li class=›‹a href=../pages/careers›Карьера‹/a›‹/li›‹li class=›‹a href=../pages/contact›Контакты‹/a›‹/ li› вместо ссылок, стилизованных css. Я надеюсь, что в этом есть смысл. Вместо того, чтобы быть меню в стиле css, оно буквально показывает весь код на странице, я добавил то, что показывает исходный код в моем посте выше... ваша помощь приветствуется. Спасибо! - person slovak_100; 06.09.2011
comment
Я обновил свой ответ. Вы должны добавить html_safe в конец метода. В Rails 3 html по умолчанию экранирован. - person Harish Shetty; 06.09.2011
comment
Кандада... Большое спасибо! Ты сделал это! Я очень благодарен за всю вашу помощь! Это работает отлично. Большое спасибо!! - person slovak_100; 06.09.2011