通过在发送电子邮件时绑定包含实例变量的erb模板来生成PDF

时间:2016-10-20 09:47:11

标签: ruby-on-rails ruby erb

发送邮件时,我需要将邮件转换为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>

但我想要这种实施。

2 个答案:

答案 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>"