如何在Ruby on Rails中实现特定于部分的导航?

Mat*_*ish 12 ruby templates ruby-on-rails actionview

我有一个Ruby/Rails应用程序,有两个或三个主要"部分".当用户访问该部分时,我希望显示一些子导航.所有三个部分都使用相同的布局,因此我无法"硬编码"导航到布局中.

我可以想到几种不同的方法来做到这一点.我想为了帮助人们投票,我会把它们作为答案.

还有其他想法吗?或者你投票给谁?

Oll*_*lly 9

您可以使用partials轻松完成此操作,假设每个部分都有自己的控制器.

比方说,你有三个部分称为帖子,用户管理员,每个都有它自己的控制器:PostsController,UsersControllerAdminController.

在每个相应的views目录中,您声明一个_subnav.html.erb部分:

/app/views/users/_subnav.html.erb
/app/views/posts/_subnav.html.erb
/app/views/admin/_subnav.html.erb

在每个subnav部分中,您声明了特定于该部分的选项,因此/users/_subnav.html.erb可能包含:

<ul id="subnav">
  <li><%= link_to 'All Users', users_path %></li>
  <li><%= link_to 'New User', new_user_path %></li>
</ul>
Run Code Online (Sandbox Code Playgroud)

虽然/posts/_subnav.html.erb可能包含:

<ul id="subnav">
  <li><%= link_to 'All Posts', posts_path %></li>
  <li><%= link_to 'New Post', new_post_path %></li>
</ul>
Run Code Online (Sandbox Code Playgroud)

最后,一旦完成此操作,您只需要在布局中包含subnav partial:

<div id="header">...</div>    
<%= render :partial => "subnav" %>
<div id="content"><%= yield %></div>
<div id="footer">...</div>
Run Code Online (Sandbox Code Playgroud)


Mat*_*ish 7

  1. 部分渲染.这与helper方法非常相似,除了布局可能有一些if语句,或者将其传递给helper ...


web*_*mat 7

至于你的子菜单的内容,你可以在每个控制器中以声明的方式进行.

class PostsController < ApplicationController
#...
protected
  helper_method :menu_items
  def menu_items
    [
      ['Submenu 1', url_for(me)],
      ['Submenu 2', url_for(you)]
    ]
  end
end
Run Code Online (Sandbox Code Playgroud)

现在,无论何时从视图中调用menu_items,您都可以使用正确的列表来迭代特定控制器.

这比使用逻辑放在视图模板中更清晰.

请注意,您可能还想在ApplicationController中声明一个默认(空?)menu_items.