我想在我的电子邮件中附加动态文件。我有以下代码:
attachments["#{@company}likelist.xls"] = File.read("#{Rails.root}/app/views/products/like_list.xls.erb")
like_list.xls.erb
是通过在Ruby中迭代变量而创建的动态HTML表。我使用respond_to format.xls
将like_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中附加动态文件?
答案 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中:
在自由办公室开设附件
希望有帮助并随意提出一些其他问题。
<强>更新强>
首先,您从Hash参数创建OpenStruct。然后创建一个新的ERB类实例。
result
是ERB类的一种方法,它将params应用于现有模板。
binding
是一个对象,它提供对另一个对象拥有的实例方法和变量的访问。
更多信息here
instance_eval
是一个Object方法,它在接收者(obj)的上下文中计算包含Ruby源代码或给定块的字符串。
更多信息here
所以,该代码执行以下操作
binding
对象,并将键值对分配给模板。您可以参考此SO post了解更多详情