我需要能够使用布局从模板共享本地数据(在yaml文件中)。我希望能够在模板中加载相关的YAML数据,然后从布局(和相关的部分)访问该数据。这可能吗?
我发现this blog post似乎表明这可能是通过一些shennaigans但我无法让它工作,这似乎是hacky。是否有内置的方式在模板和布局之间传递数据?如果没有,这个博客文章中的黑客可以成功吗?
更新:现在以代码为特色!
以下是上面链接的博文中的代码。我完全按照节目试了一下,然后玩了一下,但没有骰子。
# 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
是魔鬼的工作,并且“从不使用它”所以这个解决方案对我来说似乎很粗略。)
我自己尝试做类似下面的事情,如果YAML像这样加载到模板中:
data = YAML.load_file('some/file/data.yml')
在模板中可以正常工作,但布局会引发undefined local variable
错误。
如果将YAML加载到布局中,则相同但反过来也是如此,模板中将无法访问它。另外,我不希望在布局中加载数据,因为它会根据它来自的模板而有所不同。
理想情况下,我只是将加载的YAML数据从模板传递到布局,但我想我也可以实现我的最终目标,如果新的布局(它是一个多博客网站)被调用。然而,在与Middleman团队的一些人交谈后,这条路线似乎不是一种选择。
答案 0 :(得分:3)
事实证明,要将数据从模板传递到布局,您需要做的就是声明一个实例变量。所以对于我正在做的YAML数据:
# In your template
<% @my_var = YAML.load_file("path/to/data.yml") %>
# In your layout
<p>My_var contains: <%= @my_var %></p>
如果您熟悉中间人下面的工具链,或者如果它在某个地方的文档中我无法找到它,我不知道这是否是显而易见的,但这就是它的全部内容。
非常感谢@dddd1919放弃这个知识炸弹。