2016-05-23 5 views
2

メールに動的ファイルを添付します。私は、次のコードを持っている:動的ファイルコンテンツを電子メールに添付する方法

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の動的ファイルを添付することができます方法はありますか?

答えて

1

テンプレートを送信していることが原因であると想定します。しかし、まずテーブルを作ってください。

あなたの@like_listはどのデータ型がわかりませんが、それはハッシュです。

この場合、添付ファイルを作成する必要があります。

# mailer 
    def table_deliver 
    to = "[email protected]" 
    from = "[email protected]" 
    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

希望にオープンしたここで基本的な考え方を示して単なる例ですいくつかの追加の質問をしてください。

UPDATE

まず、あなたのハッシュのparamsからOpenStructを作成します。次に、新しいERBクラスインスタンスを作成します。

resultは、既存のテンプレートにparamsを適用するERBクラスのメソッドです。

bindingは、別のオブジェクトが所有するインスタンスメソッドおよび変数へのアクセスを提供するオブジェクトです。

詳しい情報here

instance_evalは、受信機(OBJ)のコンテキスト内で、Rubyのソースコード、又は所定のブロックを含む文字列を評価するオブジェクトのメソッドです。

詳細情報はhere

ので、そのコードは以下の

  • は、テンプレートおよび譲受人のコンテキストでbindingオブジェクトを実行し、新しいテンプレートを作成し、キーと値のペアを持ついくつかの構造体を作成しますキーと値のペアをテンプレートに追加します。

あなたはあなたの助けのための詳細については、このSO post

+0

感謝を参照することができます。 'template.result(opts.instance_eval {binding})'が何をしているのか説明できますか? –

関連する問題