0

我正在寻找一个很好的模式来拥有一个取决于用户状态和当前路径的导航栏。

在我们的应用程序中,我们有一个导航栏,它显示登录用户的用户特定选项(我的个人资料、我的工作等)和来宾用户的来宾特定选项(它是如何工作的、成为会员等) )。

现在我们还有一个演示用户,当他在路径子集上时应该向用户显示特定选项,当他在不同路径上时应该显示来宾特定选项。

我当前的解决方案是存储在数组中的白名单和检查当前路径是否在数组中的函数。

ALLOWED_FOR_DEMO = ['profile', 'demo_jobs', 'jobs']

def allowed_for_demo?
  ALLOWED_FOR_DEMO.each { |path|
    return true if request.path.include? path
  }
  return false
end

然后在标题视图中进行检查。

<% if allowed_for_demo? %>
  <div class="navbar">
    <div class="navbar-inner">
      <div class="container">
      </div>
    </div>
  </div>
<% end %>

如果您问我,这种模式非常糟糕,所以如果有人对此有更好的模式,将不胜感激。

4

2 回答 2

0

更好的是你可以试试这个。至少它会在找到第一个元素后立即返回。

def allowed_for_demo?
  ALLOWED_FOR_DEMO.any? { |path|
    request.path.include? path
  }
end
于 2013-08-21T09:13:28.703 回答
0

ALLOWED_FOR_DEMO 是全局变量吗?如果你把它放在一个助手中,你可以定义两种方法,一种用于填充数组,另一种用于检查它是否允许用于演示。

class AllowedDemoHelper
  def set_allowed_demo_path(path)
    @allowed_demo_path = path
  end

  def allowed_for_demo?
   (@allowed_demo_path || []).any? do |path|
     request.path.include? path
   end
  end
end

您也可以将它放在 ApplicationController 中,但我认为辅助方法更好。

于 2013-08-21T10:59:54.533 回答