如何获取我的Rails应用程序的基本URL(例如http:// localhost:3000)?

时间:2009-10-02 15:37:57

标签: ruby-on-rails paperclip attachment

我正在使用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 个答案:

答案 0 :(得分:20)

通常root_url应提供此功能。

File.read期待文件路径,但不是网址。如果要生成图像,则应调用图像生成代码并返回生成图像的字节,而不是调用File.read(…)

答案 1 :(得分: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。

答案 2 :(得分:4)

request.env["HTTP_HOST"]

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

答案 3 :(得分:1)

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

asset.path应该为您提供该文件的操作系统感知路径,但使用paperclip也不需要。 Paperclip::Attachment is already an IOStream.

您只需要:body => asset

touchpoint.assets.each do |asset|
  attachment :content_type => asset.file_content_type,
             :body => asset
end