布局中的实例变量

put*_*utt 7 layout ruby-on-rails

我对rails非常陌生,所以如果我使用错误的术语,我会道歉.

我有一个模型Menuitem,我想在布局中显示内容.如何将实例变量传递到布局?

我正在寻找某种布局助手,但我找不到任何东西.我还在考虑在应用程序控制器中定义实例变量以在布局中访问它,这会起作用吗?如果是这样,最好的办法是什么?

谢谢!

mad*_*lep 16

将变量从视图传递到父布局的常用方法是使用该content_for方法.(这个答案是我在这个问题上发布的类似答案的副本+粘贴)

普通视图内容会自动呈现到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>
Run Code Online (Sandbox Code Playgroud)

app/views/posts/index.html.erb

<%= content_for :menu_items, some_helper_to_generate_menu %>
<h1>Here is you page content</h1>
Run Code Online (Sandbox Code Playgroud)


Mat*_*ght 3

我要注意两件事。首先,您可能不希望每次在应用程序中呈现任何页面时都执行此查询。您肯定想缓存您的菜单项。其次,在 MenuItems 类上放置一个方便的方法来缓存此值可能会有所帮助。所以,如果我定义一个方法

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

我可以在布局中调用 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 %>
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过调用使该片段过期:

expire_fragment(:controller => "menu_items", :action => "list", :action_suffix => "all_menu_items")
Run Code Online (Sandbox Code Playgroud)