2016-08-16 129 views
4

我想显示两个不同的导航栏。当您登录时,会在除主页以外的所有页面上显示一个。另一个导航栏将显示在我的着陆页上。在除主页外的所有页面上显示导航栏

我想我可能需要写一个if语句。

If (current user is not logged in) or maybe (current user is viewing home page) do 
<nav>Second navbar</nav> 
else 
<nav>First navbar</nav> 
end 

我对轨道非常陌生,所以我可能是错的。 (是的,我知道这不是如何正确撰写如果Ruby代码)

首页位于:

家/ index.html.erb

回答

2

我通常做以下设置:

  • 创建部分shared/_nav_menu.html.erb

内部分我把逻辑一样:

<% if current_user %> 
    // nav bar for logged in user 
<% else %> 
// nav bar for non logged in users 
<% end %> 

内。然后application.html.erb文件I呈现partial是这样的:

<%= render :partial => 'shared/_nav_menu' if show_menu? %> 

里面我application_controller我把逻辑是这样的:

def show_menu? 
    true 
end 

helper method: show_menu? 

如果我不想显示菜单static_pages然后里面static_pages_controller我改写show_menu?方法返回false

class StaticPagesController < ApplicationController 
    def show_menu? 
    false 
    end 

    helper_method: show_menu? 
end 

你不必原封不动地使用这个设置,但我喜欢这种设置,因为我nav menu逻辑是在局部保持独立。所有nav menu所需的逻辑都存在于此文件中。

这种方法不会使我的application.html.erb文件膨胀,其中有很多if..else

1

对于两个菜单的情况,但是让自己打开更多,我会使用一个与Reboot的答案类似但略有不同的方法。

在布局:

<%= render :partial => @nav_bar_partial %> 

然后在我的应用控制器,定义默认导航:

def standard_nav 
    @nav_bar_partial = "path/to/standard/nav/partial" 
end 

从那里,你可以重写导航部分,你需要的任何时间(与任何部分你想要)从你的控制器

@nav_bar_partial = "path/to/new/nav/partial" if condition_that_requires_a_different_nav 

这样,你有更多的灵活性。如果由于某种原因,您想为其他条件添加第三个导航栏,则可以在其他位置覆盖该部分而不更改以上任何代码。

相关问题