2

'to_xls'gemを使用してxlsを生成しています。だから私は好きです:

my_xls = User.all.to_xls

ActionMailerを使用して送信したいので、次のように試しました。

attachments[my_xls.original_filename] =  {
   :content=>my_xls.read, 
   :mime_type=>my_xls.content_type
}

しかし、驚いたことに、my_xlsはファイルではなく文字列です。新しいファイルを開いて文字列を書き込むことで解決できると思いますが、Herokuを使用していて、ファイルへの書き込みが好きではありません(アクセスが拒否されました)。最善の解決策は、ファイルのようなストリームデータ(HTMLフォームからファイルを取得するなど)を生成して送信することです。

新しいファイルを生成せずにデータのストリームをビューに送信する、railssend_dataコントローラーメソッドのようなものが必要です。

だから、どうすればそれを行うことができますか?

4

2 に答える 2

1

以下のコードのチャンクは魅力のように機能します。私はこれを試しましたが、動作中のアプリケーションです。

def send_excel_report(file_name, emails, subject, email_content, file_path, bcc_emails = [])

    attachments["#{file_name}.xls"] = File.read(file_path)

    mail(to: emails, subject: subject, from: "my_email@gmail.com", bcc: bcc_emails) do |format|
      format.html { render :partial => "users/mail_body"}
    end
  end

参考:スプレッドシートの宝石を使用してExcelを作成しました

于 2016-12-14T10:59:26.223 に答える
1

これに近いものは、MIME タイプが間違っている可能性があります。以下のコードでは一般的ですが、アクションメーラーの Rails コードで使用する形式は次のとおりです。

attachment "application/octet-stream" do |a|
  a.body = my_xls.read
  a.filename = my_xls.original_filename
end

可能なタイプは次のとおりです。

「application/octet-stream」の代わりに「application/excel」または「application/vnd.ms-excel」

私はこれをテストしていません...

また、 my_xls が文字列の場合は、ネットワーク経由で送信する前にバイトに変換する必要がある場合があります。

my_xls.bytes.to_a.pack("C*")

これについて話している SOF トピックがここにありますが、これは send_data に関するものですが、それでも適用される可能性があります。

スプレッドシート プラグインと組み合わせた Ruby on Rails での send_data の難しさ

うまくいけば役立つ方向にあなたを向けようとしているだけです!

于 2012-07-18T06:21:16.150 に答える