0

我正在使用引导带布局,它使用“ul”和“li”构建一些菜单

  <li>
    <a href="index.html">
      <i class="icon-x"></i>
      <span>Some action</span>
    </a>
  </li>


  <li>
    <a href="#" class="dropdown-toggle" >
      <i class="icon-y"></i>
      <span>Group action</span>
    </a>
    <ul class="submenu">
      <li><a href="/subs1"> Submenu 1</a></li>
      <li><a href="/subs2"> Submenu 2</a></li>
    </ul>
  </li>
....

这没关系,但我将使用数据库表中的数据构建这个结构。我创建了一个助手来从数据库加载数据并构建这个菜单。但这会导致每次页面重建时向服务器发送几个“选择”命令。

我的问题是,你们是怎么做到的?

更新:

这是我的帮助代码(注意我的实际代码有点复杂):

module ApplicationHelper
  def build_main_menu
    menus = Menu.all(:conditions => "root_id is null")
    menus.map do |m|
      content_tag :li do
        content_tag :a, :href => m.url do
          concat(content_tag(:i, :class => m.icone) do end)
          concat(content_tag(:span, m.legenda))
        end
      end
    end.join("\n").html_safe
  end
end

和erb布局:

<ul class="nav nav-list">
  <%= build_main_menu %>
</ul>
4

2 回答 2

0

你可以这样使用:

<%= link_to  controllers_path do %>
    Some Action <i class="icon-x"></i>
<% end %>
于 2013-05-06T11:14:40.023 回答
0
@menus ||= Menu.all(:conditions => "root_id is null")

这会将您的查询缓存在 var 中,但我认为您不应该担心日志说您正在多次访问数据库,因为 Rails 已经缓存了查询,您的日志应该用 CACHE 说明一些内容。

建议,提取该函数以建模并使用 where 而不是全部,您将使用 where 延迟加载资源

class Menu
  scope :without_root, where('root_id is null')

在你的助手中

@menus ||= Menu.without_root

我认为我的第二段仅在您使用 where 时才适用。

于 2013-05-06T11:35:00.043 回答