0

首先,让我说我很熟悉content_for。这不是我在这里寻找的东西。

我想允许一个模板和任意数量的部分来构建,比如说,我想要加载的 JavaScript 文件列表,并将它们传递给布局,以便它处理并添加到该<head>区域。我只想在页面确实需要它们时加载文件,所以我宁愿不只是将它们全部放入布局中。它似乎也不像是由控制器处理的事情,因为这些主要是特定于视图的更改。

我试过用content_for它来返回一个名称数组,但这似乎不起作用。它也不允许多个部分将自己的先决条件添加到列表中。我还尝试在模板/部分中使用辅助函数添加到列表中,然后在布局中使用该列表,但似乎布局代码是在模板代码之前评估的。

有任何想法吗?顺便说一下,这不是 JavaScript 特有的。我只需要一种将 Ruby 对象从模板/部分传递到布局的方法。

编辑:每个请求,一个例子。css_import只是我写的一个模拟 CSS 的助手@import

# In the layout
<style type="text/css">
<%- yield(:foobar).each do |foo| -%>
  <%= css_import foo %>
<%- end -%>
</style>

# In the template
<%- content_for :foobar do
  ['layout', 'recipes', 'user']
end -%>

# The actual output from View -> Source
<style type="text/css"> 
</style>
4

1 回答 1

1

也许你应该看看 content_for 在做什么?它只是执行您分配给调用的块并将其存储在实例变量中。当使用正确的参数调用 yield 时,它会返回实例变量。

完全可以创建自己的两个辅助方法来实现您的目标,例如:

def register(key, value)
    @registry[key] = value
end

def fetch(key)
    @registry[key]
end

您可以随心所欲地制作这些函数,例如,当注册表仅包含 JavaScript 文件的位置时,您可以返回 HTML JavaScript 包含标记,而不仅仅是文件路径。

于 2009-10-08T07:09:15.487 回答