如何在创建“A”对象时将模板名称作为字符串传递。如果我使用以下代码执行此操作,则会写入模板的名称而不是它的表示。
template1 = "Today is <%= @weekday %>."
template2 = "Tomorow is <%= @weekday %>."
template3 = "Yesterday was <%= @weekday %>."
class A
include ERB::Util
def initialize template, day
@template = template
@weekday = day
end
def render()
ERB.new(@template).result
#ERB.new(@template).result(binding)
end
def save(file)
File.open(file, "w+") do |f|
f.write(render)
end
end
end
day = Time.now.strftime('%A')
#name of template from outside source as a string
template_to_use = 'template3'
list = A.new template_to_use, day
list.save 'list.txt'
如果我将表达式更改为template_to_use = template3
(删除引号),代码工作正常,文件会根据模板正确生成,但问题是我将从yml定义中接收此值,并且这个值将以字符串形式出现。
所以我需要以某种方式将此字符串用作方法名称。 但我不知道我该怎么做。 对此类问题的任何帮助或更好的方法都将不胜感激。
答案 0 :(得分:0)
我认为你真正想要的是哈希:
templates = {
'template1' => "Today is <%= @weekday %>.",
'template2' => "Tomorow is <%= @weekday %>.",
'template3' => "Yesterday was <%= @weekday %>."
}
# your other stuff here...
template_to_use = templates['template3'] #=> "Yesterday was <%= @weekday %>."
答案 1 :(得分:0)
我找到了问题的解决方案,模板定义发生了变化
def template3
%{ "Today is <%= @weekday %>." }
end
并使用eval
def initialize template, day
@template = eval(template)
#Other code
end
Obs:代码不是最漂亮的代码,但这不是主要问题。