发送邮件时,我需要将邮件转换为pdf文档。
为了做到这一点,我需要将erb模板与数据绑定,但erb模板包含实例变量
让模板为..,
<h1>Name: <%=@name%><h1>
<h2>Address: <%= @address %><h2>
我在question中使用了一个名称空间,用于将模板与数据绑定在一起。
class Namespace
def initialize(hash)
hash.each do |key, value|
singleton_class.send(:define_method, key) { value }
end
end
def get_binding
binding
end
end
ns = Namespace.new(name: 'Joan', address: 'Chennai, India')
ERB.new(template).result(ns.get_binding)
这适用于不包含实例变量的模板。
我需要将数据传递给模板中的实例变量是否有可能这样做。
我知道通过为实例变量分配我们绑定的数据来解决这个问题的方法,即
模板中的
<% @name = name %>
<% @address = address %>
<h1>Name: <%=@name%><h1>
<h2>Address: <%= @address %><h2>
但我不想要这种实施。
答案 0 :(得分:3)
我希望您渲染HTML字符串以生成一些PDF /类文件。在这种情况下,我们需要从您调用这些调用的位置声明实例变量。这样就可以通过请求访问它。 (相同的邮件概念)
我尝试了下面的那些案例。它有效。
def generate_attachment(your_variable)
@your_instance_variable = your_variable
attachments['attachment.pdf'] = WickedPdf.new.pdf_from_string(render_to_string(:pdf => "filename.pdf",:template => '/_template.html.erb'))
end
答案 1 :(得分:2)
您可以修改Namespace#initialize
方法,使其分配实例变量,而不是为哈希的每个键定义实例方法:
class Namespace
def initialize(hash)
hash.each do |key, value|
instance_variable_set(:"@#{key}", value)
end
end
def get_binding
binding
end
end
ns = Namespace.new(name: 'Joan', address: 'Chennai, India')
#=> #<Namespace:0x007feca2400e98 @address="Chennai, India", @name="Joan">
ERB.new(template).result(ns.get_binding)
#=> "<h1>Name: Joan<h1>\n<h2>Address: Chennai, India<h2>"