2009-10-08 54 views
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> 
+1

你有没有一个你现在在做什么的例子? – 2009-10-08 06:45:30

+0

它确实看起来像content_for正是你需要在这里。你可以发布一个不起作用的例子吗? – jdl 2009-10-08 06:48:16

+0

添加示例。我可能只是愚蠢的,哈哈,但我还没有能够拿出任何可行的替代方案... – Twisol 2009-10-08 07:06:24

回答

1

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

应该是完全有可能创建自己的两个辅助方法来实现自己的目标,例如:

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

def fetch(key) 
    @registry[key] 
end 

只要你喜欢你可以让这些功能花哨,例如当注册表中只包含位置到JavaScript文件,您可以返回HTML JavaScript包含标记,而不仅仅是文件路径。

+0

疯狂;我发誓我曾尝试过这样的事情,但没有奏效。现在我唯一的问题是,如果我从布局中调用partial,并且在该partial中注册()某些东西,则不适用(因为它已经超过了我使用fetch()的部分。 – Twisol 2009-10-08 07:39:12

+0

深入了解Rails源代码,他们应该已经解决了这个问题:-) – 2009-10-08 07:46:03

+0

当我只是第一个项目时,我不认为我必须看Rails *源代码*。 \ *笑\ *。 – Twisol 2009-10-08 07:54:37