2009-08-18 7 views
0

どこのコントローラビューとレイアウトの両方でグローバルにアクセスできるようにするための変数(コレクション)を定義する必要がありますか?アプリケーションコントローラのどこか、またはセッション中ですか?一例として レールのコレクションへのグローバルアクセス

if current_user.has_role("admin") 
@groups=Group.all 
else 
@groups=Group.all(:conditions => {:hidden => false}) 
end 

@groupsコレクションは、(他のすべてのコントローラのために、メニューに)レイアウトの両方でレンダリングするためにアクセス可能である必要があり、グループコントローラインデックスビューで

答えて

0

は、あなたにはそれを置く必要があります

def index 
    if current_user.has_role("admin") 
    @groups = Group.all 
    else 
    @groups = Group.all(:conditions => {:hidden => false}) 
    end 
    ... 
    ... 
end 

このアクションのすべてのレイアウト要素にアクセスできます。あなたはbefore_filterを追加するよりも、それは一方のコントローラのすべてのアクションにアクセスできるようにしたい場合:

アクションメソッドが実行される前にload_groupsメソッドを実行しbefore_filter
class SomeController < ApplicationController 
    before_filter :load_groups 

    def load_groups 
    if current_user.has_role("admin") 
     @groups = Group.all 
    else 
     @groups = Group.all(:conditions => {:hidden => false}) 
    end 
    end 

    ... 
end 

すべてのコントローラでアクセスできるようにするには、上の例をApplicationControllerに入れます。

0

アプリケーションにhelperメソッドを配置すると、コントローラまたはビューから呼び出すことができます。 application_helper.rb

def membership 
    if current_user.has_role("admin") 
    @groups ||= Group.all 
    else 
    @groups ||= Group.all(:conditions => {:hidden => false}) 
    end 
    @groups 
end 

あなただけのメンバーシップを呼び出す(または任意のあなたはそれに名前を付ける)ビューまたはコントローラからこの方法です。

+0

IIRC ApplicationHelper方法コントローラーから呼び出すことはできませんが、そうすることができます。これをApplicationControllerに追加してください: "ApplicationHelperを含める" – ryanb

+0

うん - 私はそれを逃しました。 Ryanの修正に感謝します。 –

+0

あるいは、ApplicationControllerにメソッドを持ち、ヘルパーを含めるのではなく、ApplicationControllerで "helper_method:membership"を呼び出します。 – Shadwell

0

進めるklew's example:アプリケーションコントローラにbefore_filterによって呼び出されるメソッドでこれを置く:

visible方法は Groupモデルに named_scopeによって定義され
@groups = current_user.has_role("admin") ? Group.all : Group.visible 

class Group < ActiveRecord::Base 
    named_scope :visible, :conditions => { :hidden => false } 
end 
関連する問題