【发布时间】:2015-03-25 03:54:58
【问题描述】:
我需要能够从带有布局的模板共享本地数据(在 yaml 文件中)。我希望能够在模板中加载相关的 YAML 数据,然后可以从布局(和相关的部分)访问该数据。这可能吗?
我找到了this blog post,这似乎表明这可以通过一些恶作剧来实现,但我无法让它工作,这似乎很老套。是否有在模板和布局之间传递数据的内置方法?如果没有,这篇博文中的 hack 能否生效?
更新:现在包含代码!
这是上面链接的博客文章中的代码。我按原样试了一下,玩了一下,但没有骰子。
# 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 团队的一些人交谈后,这条路线似乎不是一个选择。
【问题讨论】:
-
你能发布一些代码吗?当您从布局中访问时,您是什么意思? YAML 文件中的数据是否始终是最新的?
-
“可从布局访问”我的意思是我希望布局包含模板知道的数据。示例:模板包含博客文章的作者信息,然后布局有一个边栏,其中包含有关该作者的信息。布局需要知道模板中声明的作者信息。作为或“总是最新的”,我不确定你的意思,但我的直觉是,是的。此 YAML 文件中的数据不会经常更改。
-
最好使用
@data而不是data -
我不敢相信事情就这么简单。太感谢了。从今天起,我将以最高荣誉歌唱@dddd1919的名字。
-
顺便说一句,在模板中设置这个逻辑操作不是一个好方法,控制器或助手更好的地方