我想问你关于创建菜单的最佳rails方法。 我应该做一个横向菜单。每个页面都属于此菜单的特定项目,当用户在此页面上打开时,此项目应具有id =“current”。
<ul>
<li id="current">Home</li>
<li>About us</li>
</ul>
据我所知,我应该创建一个特殊的帮助器来创建这个html标记,并在每个页面的每个视图上使用带有特殊参数的帮助器。也许有更好的轨道方式来做到这一点?
PS。更新
我的解决方案:
class ApplicationController < ActionController::Base
protect_from_forgery
before_filter :open_most_important
protected
def open_most_important
@menu = {
:cases => { :name => 'Cases', :link => '/cases'},
:groups => { :name => 'Groups', :link => '/groups' },
:projects => { :name => 'Projects', :link => '/projects' },
:settings => { :name => 'Settings', :link => '/settings' },
:about => { :name => 'About us', :link => '/about' }}
@current_menu_item = :cases
end
布局application.html.erb
的片段:
<div id="menu">
<ul>
<% @menu.each do |item, value| -%>
<% if @current_menu_item == item -%>
<li id="current"><a href="<%= value[:link] %>"><%= value[:name] %></a></li>
<% else -%>
<li><a href="<%= value[:link] %>"><%= value[:name] %></a></li>
<% end -%>
<% end -%>
</ul>
</div>
我需要为@current_menu_item
before_filter
答案 0 :(得分:0)
这就是我倾向于这样做的方式:
<%= menu_item("Home", root_path) {
controller.controller_name == "pages" &&
controller.action_name = "home" } %>
<%= menu_item("About us", page_path("about") {
controller.controller_name == "pages" &&
controller.action_name == "about" } %>
帮助者:
def menu_item(name, url, options = {})
if yield
options["id"] = "current"
end
link_to name, url, options
end
如果传递给"id"
的块返回true,则"current"
将为menu_item
。
答案 1 :(得分:0)
如果我理解正确,您希望此菜单出现在每个页面上。如果是这种情况,您可以将其添加到您的布局中。如果您不理解在Ruby on Rails指南http://guides.rubyonrails.org/getting_started.html#customizing-the-layout
上阅读的布局答案 2 :(得分:0)
我处理它的方法是将它放在导航部分中:
<%= nav_link "All Users", users_path, active_tabs.include?('all_users') %>
<%= nav_link "Add User", new_user_path, active_tabs.include?('add_user') %>
然后这个助手位于每个视图的顶部:
<%= nav 'nav_partials/users_tabs', 'all_users' %> # one view
<%= nav 'nav_partials/users_tabs', 'add_user' %> # another view
帮助者:
def nav_link(title, path, active, options = {})
if active
options[:class] ? options[:class] += " active" : options[:class] = "active"
end
link_to(title, path, options)
end
def nav(partial, *active_tabs)
partial = "#{params[:controller]}/nav_partials/#{partial}" unless partial.chars.first == '/'
render :partial => partial, :locals => { :active_tabs => active_tabs }
end
对我而言,它很优雅,即使有些东西可能会更好一点(比如nav
助手中的文件路径,以及在助手中引用params)。但它的效果非常好,而且非常灵活。