Chr*_*ssl 4 ruby ruby-on-rails
想象一下,在您的应用程序中有两个RESTful控制器(UsersController,OffersController)和一个PagesController(用于静态内容,如index,about等).
您定义了以下路由:
map.with_options :controller => 'pages' do |pages|
pages.root :action => 'index' # static home page
pages.about :action => 'about' # static about page
# maybe more static pages...
end
map.resources :users # RESTful UsersController
map.resources :posts # RESTful PostsController
Run Code Online (Sandbox Code Playgroud)
您的应用程序布局如下所示:
<html>
<head>
<title>Demo Application</title>
</head>
<body>
<ul id="menu">
<li>
<%= link_to 'Home', root_path %>
</li>
<li>
<%= link_to 'Offers', offers_path %>
<ul id="submenu>
<li><%= link_to 'Search', 'path/to/search' %></li>
<li>maybe more links...</li>
</ul>
</li>
<li>
<%= link_to 'About', about_path %>
</li>
<li>
<%= link_to 'Admin', users_path %>
<ul id="submenu">
<li><%= link_to 'New User', new_user_path %></li>
<li><%= link_to 'New Offer', new_offer_path %></li>
<li>maybe more links</li>
</ul>
</li>
</li>
<%= yield %>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
布局的问题是我希望#submenu任何时候只能看到一个.可以完全跳过所有其他子菜单(根本不需要渲染).
以Admin菜单为例:除了for之外,该菜单应对应用程序中的所有RESTful路径都是活动的offers_path.活动表示子菜单可见.
我能想到实现这一目标的唯一解决方案是,如果条件和糟糕(编写和维护真的很复杂),构建很复杂.我在寻找一个优雅的解决方案?
我希望有人理解我的问题 - 如果有什么不清楚只是评论这个问题,我将更详细地解释它.
你可以玩的一件事是yield和content_for,与菜单的一些部分一起使用.例如,您可以将菜单的每个部分放在一个部分,然后将您的布局修改为:
<%= yield(:menu) %>
Run Code Online (Sandbox Code Playgroud)
然后,您可以在视图中指定content_for,并将您想要的任何部分放入菜单中.如果没有指定它将不会被渲染.
<% content_for(:menu) do %>
<%= render :partial => 'layouts/menu' %>
<%= render :partial => 'layouts/search_menu' %>
etc...
<% end %>
Run Code Online (Sandbox Code Playgroud)
如果您在大多数页面中使用了大量相同的菜单,请在未找到yield(:menu)的情况下在布局中指定默认值.
<%= yield(:menu) || render :partial => 'layouts/menu_default' %>
Run Code Online (Sandbox Code Playgroud)
为您节省大量的打字费用.:)我发现这是处理事情的一种很好的清洁方式.