Как получить базовый URL (например, http://localhost:3000) моего приложения на Rails)? - PullRequest
9 голосов
/ 02 октября 2009

Я использую 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 ]

20 голосов
/ 02 октября 2009

Обычно root_url должен предоставить это.

File.read ожидает путь к файлу, но не URL. Если вы генерируете изображения, вы должны вызвать код генерации изображения и вернуть байты сгенерированного изображения вместо вызова File.read(…)

4 голосов
/ 10 февраля 2013
request.env["HTTP_HOST"]

Я не знаю, почему эта строка кода так неуловима в Интернете. Кажется, это должно быть впереди и в центре.

4 голосов
/ 08 февраля 2010

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

НТН.

1 голос
/ 13 марта 2011

как говорит ZiggyTheHamster: asset.url - это сгенерированный URL, который будет использоваться на веб-страницах (именно поэтому вы получаете косые черты каталогов в стиле unix, как указано в комментариях)

asset.path должен указывать путь к файлу с учетом ОС, но даже с помощью paperclip это не нужно. Скрепка :: Приложение уже является IOStream.

Вам просто нужно :body => asset вот так:

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