【问题标题】:Dynamic menu ruby on rails and partial动态菜单 ruby​​ on rails 和 partial
【发布时间】:2011-09-03 16:01:20
【问题描述】:

我对 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 的类,如果用户在相应的页面上。例如,如果用户在 Contact 页面上,则 active_page 类将仅传递给 Contact li 元素。

我尝试了几种解决方案,包括创建多个 CSS 版本并在与页面对应的body 上传递一个类?例如,

%body{:class => @page_name}

然后在 pages_helper 中定义@page_name 如下:

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

这两个版本似乎都不起作用,因为前者 (@active_page) 不会产生任何结果。同样,我无法在 body 标签上分配一个类——当我检查源代码时,body 标签没有任何类。

如果能提供有关如何使用部分实现动态菜单的帮助,我将不胜感激。如果有我没有尝试过的方法,请随时通知我。我真诚地感谢您的所有帮助,我非常感谢您的时间!谢谢!

使用 Kanadada 的解决方案。该页面在应出现样式菜单的位置按字面意思显示以下文本:

<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 中的解释方式有关?

【问题讨论】:

    标签: html ruby-on-rails css partial


    【解决方案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
    

    【讨论】:

    • 感谢您的建议 Kandada... 最后一组代码,是否像 pages_controller.rb 或路由文件一样在 PagesController 中执行?
    • 更新了我的答案看看。
    • 感谢您的更新,神田!但是,当我使用上面的建议时,该部分没有样式...页面仅显示:
    • About
    • 职业
    • 联系方式
  • 不要使用相对路径。使用我建议的第二种方法。我一直使用这个解决方案。它可以正常工作。
  • 我不确定你的意思是相对路径。我试过你的代码,但它不起作用。我完全按照上面列出的方式做到了。我需要在路由文件中有特定的内容吗?另外,我正在为我的静态页面使用 HighVoltage...这会导致问题吗?
  • 猜你喜欢
    相关资源
    最近更新 更多
    热门标签