Errno :: ENOENT - 没有这样的文件或目录@ rb_sysopen

时间:2017-04-17 06:03:42

标签: ruby-on-rails ruby actionmailer email-attachments

我正在尝试使用ruby on rails上的动作邮件发送电子邮件附件,我一直收到此错误。问题似乎是它无法在我指定的目录中找到该文件,但文件路径有效。我还在控制台中使用File.exist?检查了这一点,并确认提供的路径的计算结果为true。

这是我的邮件:

class OrderMailer < ApplicationMailer   
  def purchase(order)
    @order = order
    attachments[ 'files.zip'] = File.read(Rails.root + '/public/albums/files.zip')
    mail to: order.email, subject: "Order Confirmation"
  end
end

我还安装了邮件gem来处理编码,正如Action Mailer文档所建议的那样。

非常感谢任何帮助, -Brian

2 个答案:

答案 0 :(得分:7)

Rails.root会返回Pathname个对象。 Pathname#+(string) File.join string路径为,如果它是相对的;如果string表示绝对路径(即以斜杠开头),则路径会被替换

Pathname.new('/tmp') + 'foo'
# => #<Pathname:/tmp/foo> 
Pathname.new('/tmp') + '/foo'
# => #<Pathname:/foo> 

这意味着,您正在阅读错误的路径:您想阅读/path/to/app/public/albums/files.zip,但实际上您正在阅读/public/albums/files.zip,这可能不存在。

解决方案:确保附加相对路径:

Rails.root + 'public/albums/files.zip'

答案 1 :(得分:-1)

Rails.root返回路径对象。因此,您需要将其转换为字符串以将其与另一个字符串连接,如下所示: ( Rails.root.to_s +&#39; /public/albums/files.zip')