【问题标题】:Letting a template and multiple partials add to the layout让模板和多个部分添加到布局中
【发布时间】:2010-12-04 21:22:07
【问题描述】:

首先,让我说我熟悉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>

【问题讨论】:

  • 你有你现在在做什么的例子吗?
  • 看起来 content_for 正是您在这里所需要的。你能发布一个它不起作用的例子吗?
  • 添加了示例。我可能只是愚蠢,哈哈,但我也无法想出任何可行的替代方案......

标签: ruby-on-rails templates partials


【解决方案1】:

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

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

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

def fetch(key)
    @registry[key]
end

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

【讨论】:

  • 疯了;我发誓我以前尝试过类似的方法,但没有奏效。现在我唯一的问题是,如果我从布局中调用一个部分,并且我在该部分中注册()某些东西,它不适用(因为它已经超过了我使用 fetch() 的部分。
  • 深入研究 Rails 源代码,他们应该已经解决了这个问题 :-)
  • 当这只是我的第一个项目时,我认为我不必查看 Rails 源代码。 *笑*
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-12
  • 1970-01-01
  • 1970-01-01
  • 2018-08-14
  • 2012-10-17
  • 2013-07-05
相关资源
最近更新 更多