在除主页之外的所有页面上显示导航栏

时间:2016-08-16 18:46:06

标签: ruby-on-rails ruby

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

我想我可能需要写一个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

我对rails很新,所以我错了。 (是的,我知道不是如何在Ruby中正确编写if语句)

主页位于:

家/ index.html.erb

3 个答案:

答案 0 :(得分: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文件中我像这样渲染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 :(得分: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

这样,你就有了更多的灵活性。如果由于某种原因你想为其他条件添加第三个导航栏,你可以在不改变任何上述代码的情况下覆盖其他部分。

答案 2 :(得分:0)

您可以准备两个布局,一个用于着陆页,另一个用于其余页面。请查看官方文档:http://guides.rubyonrails.org/layouts_and_rendering.html