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

ALLOWED_FOR_DEMO はグローバル変数ですか? これをヘルパーに入れると、2 つのメソッドを定義できます。1 つは配列を生成するためのもので、もう 1 つはデモが許可されているかどうかを確認するためのものです。

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 に答える
0

これを試すことができます。少なくとも、最初の要素が見つかるとすぐに戻ります。

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