2009-12-03 4 views
7

私は間違った用語を使用している場合、私はかなり謝罪します。レイアウトのインスタンス変数

レイアウトに内容を表示したいMenuitemモデルがあります。インスタンス変数をレイアウトに渡すにはどうすればいいですか?

何らかのレイアウトヘルパーを探していましたが、何も見つかりませんでした。私はレイアウトでアクセスするために、アプリケーションコントローラのインスタンス変数を定義することも検討していましたが、これはうまくいきますか?もしそうなら、それを行う最善の方法は何ですか?

ありがとうございます!

+0

私は明確にすべき申し訳ありません。ビューではなく、レイアウトで表示することを意味します。 – puttputt

答えて

3

2つのこと。まず、アプリケーション内の任意のページをレンダリングするたびに、このクエリを実行することは望ましくありません。あなたは間違いなくあなたのMenuItemsをキャッシュしたい。次に、この値をキャッシュするためにMenuItemsクラスに簡易メソッドを配置すると便利です。だから、私がメソッドを定義する場合

def MenuItem.all_for_menu 
    @@all_for_menu ||= MenuItem.find(:all) #returns value if exists, or initializes it 
end 

私は私のレイアウトでMenuItem.all_for_menuを呼び出して、すべてのメニュー項目を取得できます。これまでに新しいものを追加したり編集したりするときは、それを無効にする必要があります。

別のキャッシング・アプローチは、部分的にデータを入れて、標準のキャッシュコールを使用してそのフラグメントをキャッシュするようになります:

<% cache(:controller => "menu_items", 
     :action => "list", 
     :action_suffix => "all_menu_items") do %> 
    <%= render :partial => "menu", :collection => MenuItem.all_for_menu %> 
<% end %> 

その後、呼び出すことによって、そのフラグメントを期限切れにすることができます

expire_fragment(:controller => "menu_items", :action => "list", :action_suffix => "all_menu_items") 
0

コントローラで定義されているインスタンス変数は、自動的にあなたのビューで使用できます。レイアウト内のすべてのアクションのインスタンス変数が必要な場合は、before_filterでインスタンス変数を定義するか、コントローラーメソッドでカプセル化し、helper_methodを使用してビューからアクセスできるようにすることをお勧めします。

+0

before_filterのコンセプトについて詳しく説明できますか?私はhelper_methodを使って熟考しましたが、ビューでのみ使用できるようにして、必要なレイアウトでは使用できないと思います。 – puttputt

+0

helper_methodは、レイアウト、ビュー、およびヘルパーを含むビューレイヤ全体でメソッドを使用できるようにします。 – Lytol

-1

これは実際にmodelで何をしたいかによって異なります。私はちょうど推測し、あなたはこれを行う方法をより良く理解するためには、あなたが必要とするものを教えてください。このコードは、MenuItemモデルのフィールドがnameの場合にのみ機能します。明らかに

<ul id="menu"> 
<% @menu_items.each do |menu_item| %> 
    <%= h menu_item.name %> 
<% end %> 
</ul> 

これが本当のメニューだった場合、あまりにも:)

-2

items_controller.rbがハイパーリンクが存在することになる(:index.html.erbビューファイルで

# Use whatever action you are currently displaying 
def index 
    @menu_items = MenuItem.all 
end 

:コントローラで

または何か)

def show 
    @menu_item = MenuItem.find(params[:id]) 
end 
ビュー show.html.erb

:私は注意でしょう

<%= @menu_item.name %> 
14

ビューから親レイアウトに変数を渡す通常の方法は、content_forメソッドを使用することです。(この回答は、this questionに投稿した同様の回答のコピー+貼り付けです)

通常の表示内容は、レイアウトの引数なしでyieldコールに自動的にレンダリングされます。しかし、シンボル引数を持つyieldを使用し、content_forでそのコンテンツをビューから指定することによって、他のプレースホルダコンテンツを配置することもできます。

app/views/layouts/posts_layout.html.erb

<html> 
    <head> 
    <title>My awesome site</title> 
    </head> 
    <body> 
    <div id="someMenuStructureHere"> 
     <%= yield(:menu_items) %> <!-- display content passed from view for menu_items --> 
    </div> 
    <%= yield %> <!-- display main view content --> 
    </body> 
</html> 

app/views/posts/index.html.erb

<%= content_for :menu_items, some_helper_to_generate_menu %> 
<h1>Here is you page content</h1>