Ruby:如何使用动态值生成HTML?

时间:2011-09-01 23:24:38

标签: ruby eval erb

我正在编写一个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”函数包装的代码比这长得多,我只发布了一个非常小的片段来说明我想要实现的目标)

谢谢!

2 个答案:

答案 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>"