如何正确评估包含Ruby代码的评估ERB模板?

时间:2014-03-11 18:10:50

标签: ruby erb

比如说我有一个包含Ruby代码的ERB模板文件:

module <%= @name %>
  class Client
    # ...
  end
end

我想评估ERB代码,然后我想评估我得到的内容。

@name = 'Jimi'
erb = ERB.new('module <%= @name %> end')
eval(erb.result)
Jimi.class
  # => Module

我希望在单独的文件中有这样的代码的多个模板(我想它会有.rb.erb扩展名)但是我不知道如何以一种遵循良好实践并且运行良好的方式来解决这个问题。我想用它来替代复杂的元编程,否则就必须这样做。这是一个很好的选择吗? 当然问题会更复杂,而不仅仅是简单的动态模块创建。是否有更好的方法来评估评估的ERB文件的结果?

正如旁注,我正在开发一个项目,该项目目前在很大程度上依赖于元编程,因为它必须动态地创建模块,类和方法。它被命名为Hendrix,我目前正在开发版本1.0.0,我希望改进我目前正在进行的几代人的方式,我认为这些模板是可行的。

2 个答案:

答案 0 :(得分:3)

ERB在这种情况下让我觉得有点黑客攻击。如果你需要做的只是简单的替换,Ruby有内置的字符串格式:

template = "module %{name} end"
eval(template % {name: Jimi})
Jimi.class
# => Module

请参阅String#%

答案 1 :(得分:0)

eval与用户输入的使用被视为安全问题。考虑使用元编程来实现您的目标。

class_name = 'Jimi'  # read this data from a file

new_class = Class.new do
  class Client
    # ...
  end
end

Object.const_set class_name, new_class

使用元编程,可以创建模块和类,也可以以不必运行任意代码的方式定义方法。