我正在编写一个Ruby脚本,它将为我的网站生成一个大的平面HTML菜单,我可以在每次页面加载时动态生成此菜单,但我认为这样做会浪费资源,特别是因为这样做几乎从不需要改变。
我想有效地执行以下操作(在半sudocode中):
part_of_my_menu = eval %{
<script type="text/javascript">
var mapper = new Array();
<% parent_categories.each_with_index do |parent_category,i| -%>
mapper["#{parent_category.name}"] = <%= i -%>;
<% end -%>
</script>
}
然后能够将part_of_my_menu字符串变量写入HTML文件(我可以这样做)。
我知道这不是eval在Ruby中的工作方式,但是有谁知道如何实现这个相同的“包装”功能?
(fyi - 我想用“eval”函数包装的代码比这长得多,我只发布了一个非常小的片段来说明我想要实现的目标)
谢谢!
答案 0 :(得分:2)
ERB是标准库的一部分,因此您可以执行以下操作:
tmpl = %q{<script type="text/javascript">...</script>}
erb = ERB.new(tmpl)
parent_categories = [ ... ]
part_of_my_menu = erb.result
ERB文档包含一些如何使用它的好例子。
您不需要手动eval
构造,您可以使用标准的现有库和您现有的知识。
答案 1 :(得分:0)
您可能对我开发的dom gem感兴趣。您可以生成如下HTML字符串:
require "dom"
["foo".dom(:span, class: "bold"), "bar"].dom(:div).dom(:body).dom(:html)
# => "<html><body><div><span class=\"bold\">foo</span>bar</div></body></html>"