在ruby中生成带有erb的文件时的绑定问题

时间:2013-11-08 01:15:11

标签: ruby erb

如何在创建“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定义中接收此值,并且这个值将以字符串形式出现。

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

2 个答案:

答案 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:代码不是最漂亮的代码,但这不是主要问题。