9

我正在使用 Paperclip 允许用户附加内容,然后我正在发送电子邮件并希望将文件附加到电子邮件中。我正在尝试读取文件并将其添加为附件,如下所示:

# models/touchpoint_mailer.rb
class TouchpointMailer < ActionMailer::Base
  def notification_email(touchpoint)
    recipients "me@myemail.com"
    from "Touchpoint Customer Portal <portal@touchpointclients.com>"
    content_type "multipart/alternative"
    subject "New Touchpoint Request"
    sent_on Time.now
    body :touchpoint => touchpoint

    # Add any attachments the user has included
    touchpoint.assets.each do |asset|
      attachment :content_type => asset.file_content_type,
                 :body => File.read(asset.url)
    end
  end
end

这给了我以下No such file or directory - /system/files/7/original/image.png?1254497688堆栈跟踪错误,说它是对File.read. 当我访问该show.html.erb页面时,单击图像的链接,类似于http://localhost:3000/system/files/7/original/image.png?1254497688,图像显示正常。

我该如何解决这个问题?

4

4 回答 4

22

通常root_url应该提供这个。

File.read 需要一个文件路径,而不是一个 url。如果您正在生成图像,您应该调用图像生成代码并返回生成图像的字节而不是调用File.read(…)

于 2009-10-02T15:57:39.863 回答
4

asset.url返回文件的 URL。这通常是/system/classname/xx/xx/style/filename.ext. 你会把它放在一个image_tag.

你想要asset.path。它返回文件的完整路径,通常类似于/home/username/railsapp/public/system/classname/xx/xx/style/filename.ext

HTH。

于 2010-02-08T15:29:51.340 回答
3
request.env["HTTP_HOST"]

我不知道为什么这一行代码在网络上如此难以捉摸。似乎它应该在前面和中间。

于 2013-02-09T22:04:27.580 回答
1

正如 ZiggyTheHamster 所说:asset.url 是生成的 url,将在网页上使用(这就是为什么你得到 unix 风格的目录斜杠,正如评论中所指出的那样。)

asset.path 应该为您提供文件的操作系统感知路径,但即使是回形针也不需要。 Paperclip::Attachment 已经是一个 IOStream。

你只需要:body => asset这样:

touchpoint.assets.each do |asset|
  attachment :content_type => asset.file_content_type,
             :body => asset
end
于 2011-03-13T10:37:39.083 回答