从多个类绑定ERB模板

时间:2016-10-04 05:41:15

标签: ruby erb

我正在尝试从Ruby中的多个对象插入ERB模板。如果变量源是一个类,它工作正常。当ERB包含不同类中存在的变量时,这是进行插值的最佳方法。

这是我想要实现的简化版本:

#!/usr/bin/ruby

require 'erb'
require 'pp'

class Person
  attr_reader :first_name, :last_name

  def initialize(first_name, last_name)
    @first_name = first_name
    @last_name = last_name
  end

end

class Animal
  attr_reader :animal_type

  def initialize(type)
    @animal_type = type
  end

end

person = Person.new("John", "Doe")
animal = Animal.new("doggie")

template = "<%=first_name%> <%=last_name%> has a <%=type%>"

puts ERB.new(template).result(person.instance_eval { binding })

上面的错误undefined local variable or method 'type'是正确的,因为该属性属于Animal类的对象。

我找到的一个解决方法是创建哈希并使用merge将它们折叠为一个,但这意味着对现有代码进行了大量更改。有没有更好的方法来实现这一目标?

1 个答案:

答案 0 :(得分:2)

您可以使用openstruct使合并属性更友好,所以不必重写模板。

# in config/application.rb
require 'ostruct'

# in the file where you compile ERB
person = OpenStruct.new Person.new("John", "Doe").attributes
person.type = animal.type

使用OpenStruct,您的对象将是一个哈希,但像person.first_name这样的方法仍然有效。并且您可以添加任意键值,因此您可以使person.type返回您想要的任何值。