【问题标题】:Passing local data variables between layout and template在布局和模板之间传递本地数据变量
【发布时间】: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的名字。
  • 顺便说一句,在模板中设置这个逻辑操作不是一个好方法,控制器或助手更好的地方

标签: ruby middleman


【解决方案1】:

事实证明,将数据从模板传递到布局所要做的就是声明一个实例变量。所以对于我正在做的 YAML 数据:

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

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

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

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

【讨论】:

  • 听起来很不错,如果有评估变量的方法会很棒吗?比如说你在你的 yaml 文件中添加了一个部分路径,它会很好地得到已经预处理的内容。
猜你喜欢
  • 2017-03-10
  • 1970-01-01
  • 2016-12-22
  • 2011-11-09
  • 2019-11-12
  • 2021-09-06
  • 2012-09-20
  • 2021-01-05
  • 2016-06-16
相关资源
最近更新 更多