在发送邮件时,我需要将邮件转换为pdf文档。
为了做到这一点,我需要将erb模板与数据绑定,但是erb模板包含实例变量让模板为…,
<h1>Name: <%=@name%><h1>
<h2>Address: <%= @address %><h2>
我遵循了问题中提到的解决方案,使用名称空间将模板与数据绑定。
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>
但是我不想要这种实现
我希望您正在渲染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
您可以修改您的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>"