gpt4 book ai didi

ruby-on-rails - 如何在电子邮件中附加动态文件内容

转载 作者:太空宇宙 更新时间:2023-11-03 16:19:12 25 4
gpt4 key购买 nike

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

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 中附加动态文件吗?

最佳答案

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

我不知道你的@like_list 是什么数据类型,但假设它是一个 Hash。

在那种情况下,你应该建立你的附件。这里只是一个展示基本方法的例子:

  # 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

希望对您有所帮助,并随时提出一些其他问题。

更新

首先你创建一个 OpenStruct来自你的哈希参数。然后创建一个新的 ERB 类实例。

result 是 ERB 类的一个方法,它将参数应用于现有模板。

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

更多信息 here

instance_eval 是一个对象方法,它在接收者 (obj) 的上下文中评估包含 Ruby 源代码或给定 block 的字符串。

更多信息 here

因此,该代码执行以下操作

  • 用键值对创建一些结构
  • 创建新模板
  • 在模板上下文中执行绑定(bind)对象并将键值对分配给模板。

你可以引用这个SO post了解更多详情

关于ruby-on-rails - 如何在电子邮件中附加动态文件内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37402067/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com