0

创建“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 定义中接收这个值,并且这个值将作为一个字符串出现。

所以我需要以某种方式将此字符串用作方法名称。但我不知道我该怎么做。对于此类问题的任何帮助或更好的方法将不胜感激。

4

2 回答 2

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 %>."
于 2013-11-08T14:12:35.250 回答
0

我找到了问题的解决方案,模板定义略有变化

def template3
    %{ "Today is <%= @weekday %>." }
end

并使用 eval

def initialize template, day
  @template = eval(template)
  #Other code
end

Obs:代码不是最漂亮的,但这不是这里的主要问题。

于 2013-11-09T00:37:45.387 回答