如何在电子邮件中附加动态文件内容

时间:2016-05-23 23:23:41

标签: ruby-on-rails ruby

我想在我的电子邮件中附加动态文件。我有以下代码:

attachments["#{@company}likelist.xls"] = File.read("#{Rails.root}/app/views/products/like_list.xls.erb")

like_list.xls.erb是通过在Ruby中迭代变量而创建的动态HTML表。我使用respond_to format.xlslike_list.html.erb表转换为XLS,但是,由于没有执行Ruby代码,所发送的附件是空的。 File.read仅读取静态文件。

like_list.xls.erb看起来像这样:

<table border="1">
  <thead>
  <tr>
    <th><%= t ('product_table.name')%></th>
    <th><%= t ('product_table.code')%></th>
  </tr>
  </thead>
  <tbody>
    <% @like_list.each do |key, value| %>
      <% value.each do |t| %>
        <tr>
          <td><%=t.code%></td>
          <td><%=key%></td>
...

有没有办法在Rails 4中附加动态文件?

1 个答案:

答案 0 :(得分:1)

我认为那是因为你只发送了一个模板。但是你应该先构建一个表。

我不知道你的@like_list是什么数据类型,但是我们说它是哈希。

在这种情况下,您应该建立附件。这是一个显示基本方法的示例:

  # mailer
  def table_deliver
    to = "user@example.com"
    from = "no-reply@example.com"
    subject = "Foo"

    @company = "Ggl"
    @like_list = { foo: 1,
                   bar: 2,
                   baz: 3 }
    attachments["#{@company}likelist.xls"] = build_table(@like_list)
    @body = "Mail body"
    mail(to: to, from: from, subject: subject)
  end

  private

  def build_table(data)
    opts = OpenStruct.new(data)
    template = ERB.new(File.read("#{Rails.root}/app/views/products/like_list.xls.erb"))
    template.result(opts.instance_eval { binding })
  end

# template

<table>
  <thead>
    <th>foo</th>
    <th>bar</th>
  </thead>
  <tbody>
    <% data.each do |k, v| %>
      <tr>
        <td><%= k %></td>
        <td><%= v %></td>
      </tr>
    <% end %>
  </tbody>
</table>

结果在letter_opener中:

email

在自由办公室开设附件

office

希望有帮助并随意提出一些其他问题。

<强>更新

首先,您从Hash参数创建OpenStruct。然后创建一个新的ERB类实例。

result是ERB类的一种方法,它将params应用于现有模板。

binding是一个对象,它提供对另一个对象拥有的实例方法和变量的访问。

更多信息here

instance_eval是一个Object方法,它在接收者(obj)的上下文中计算包含Ruby源代码或给定块的字符串。

更多信息here

所以,该代码执行以下操作

  • 使用键值对创建一些结构
  • 创建新模板
  • 在模板的上下文中执行binding对象,并将键值对分配给模板。

您可以参考此SO post了解更多详情