在布局和模板之间传递本地数据变量

Passing local data variables between layout and template

我需要能够从具有布局的模板共享本地数据(在 yaml 文件中)。我希望能够在模板中加载相关的 YAML 数据,然后可以从布局(和关联的部分)访问该数据。这可能吗?

我发现 this blog post 这似乎表明这可以通过一些神奈子来实现,但我无法让它工作,这看起来很老套。是否有内置的方式在模板和布局之间传递数据?如果没有,这个博客 post 中的 hack 可以工作吗?

更新:现在包含 代码!

这是上面链接的博客 post 中的代码。我完全按照展示的方式尝试了它,并玩了一点,但没有骰子。

# in your layout file (inside layout/ folder):
<% myvar = yield_content :myvar %>
<% myvar = eval(myvar.to_str) %>

# in your template file (e.g., mypage.html.erb):
<% content_for :myvar, data.somefile %>

# this examples assumes there's a somefile.yml in your data/ folder:
name: hello world
tag: the quick brown jumps over the lazy dog

上面的代码返回 no implicit conversion of nil into String,这听起来像是 YAML 文件没有加载或没有传递给布局(因为它已加载到模板中。)我确认它正在加载到模板中所以也许由于某种原因它没有被传递给模板? (另外:作为一名新程序员,我被教导 eval 是魔鬼的工作,"never use it" 所以这个解决方案对我来说似乎很粗略。)

我自己尝试做类似下面的事情,如果 YAML 像这样加载到模板中:

data = YAML.load_file('some/file/data.yml')

它在模板中工作正常,但布局抛出undefined local variable错误。

如果您将 YAML 加载到布局中,则情况相同,但相反,它将无法在模板中访问。此外,我不希望在布局中加载数据,因为它会根据来自的模板而有所不同。

理想情况下,我只是将加载的 YAML 数据从模板传递到布局,但我认为如果为哪个博客(它是一个多博客站点)调用的布局是新的,我认为我也可以实现我的最终目标.然而,在与 Middleman 团队的一些人交谈后,这条路线似乎不是一个选择。

事实证明,要将数据从模板传递到布局,您只需声明一个实例变量即可。所以对于像我一样的 YAML 数据:

# In your template
<% @my_var = YAML.load_file("path/to/data.yml") %>

# In your layout
<p>My_var contains: <%= @my_var %></p>

我不知道这是否很明显,如果你熟悉中间人下面的工具链,或者它是否在某处的文档中但我找不到它,但仅此而已。

非常感谢 @dddd1919 投下这个知识炸弹。