我正在尝试从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将它们折叠为一个,但这意味着对现有代码进行了大量更改。有没有更好的方法来实现这一目标?
答案 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
返回您想要的任何值。