2009-10-02 10 views
9

Estoy usando Paperclip para permitir a los usuarios adjuntar cosas, y luego estoy enviando un correo electrónico y quiero adjuntar el archivo al correo electrónico. Estoy intentando leer el archivo y añadirlo como un archivo adjunto, así:¿Cómo obtengo la URL base (por ejemplo, http: // localhost: 3000) de mi aplicación Rails?

# models/touchpoint_mailer.rb 
class TouchpointMailer < ActionMailer::Base 
    def notification_email(touchpoint) 
    recipients "[email protected]" 
    from "Touchpoint Customer Portal <[email protected]>" 
    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 

Esto me da el siguiente error No such file or directory - /system/files/7/original/image.png?1254497688 con el seguimiento de la pila diciendo que es la llamada a File.read. Cuando visito la página show.html.erb y hago clic en el enlace de la imagen, que es algo así como http://localhost:3000/system/files/7/original/image.png?1254497688, la imagen se muestra bien.

¿Cómo puedo solucionar este problema?

Respuesta

4

asset.url devuelve la URL del archivo. Por lo general, es /system/classname/xx/xx/style/filename.ext. Poner esto en un image_tag.

Quiere asset.path. Devuelve la ruta completa al archivo, que generalmente será algo así como /home/username/railsapp/public/system/classname/xx/xx/style/filename.ext

HTH.

+1

Gracias por esto - pasar años buscando exactamente este consejo ... – snowangel

20

Por lo general, root_url debe proporcionar esto.

File.read espera una ruta de archivo, no una url. Si está generando las imágenes, debe llamar al código de generación de imágenes y devolver los bytes de la imagen generada en lugar de llamar al File.read(…)

+0

No los estoy generando, estoy dejando que el usuario los cargue y los almacene en el sistema de archivos –

+0

Pero cuando especifico el archivo (a través del método asset.url) recibo un error que dice que no puede encontrar el archivo; sin embargo, cuando lo enlace (por ejemplo, link_to asset.name, asset.url) funciona bien y puedo ver la imagen. –

+0

Pruebe 'File.read (File.join (Rails.root," public ", asset.url))' (suponiendo que las imágenes están en el sistema de archivos en 'public/system/files/...'. – cwninja

1

como ZiggyTheHamster ya es decir: la asset.url es la URL generada que se utilizaría en las páginas web

(razón por la que está recibiendo las barras de directorio de tipo Unix, como se ha señalado en los comentarios.) asset.path debe darle la ruta del archivo al sistema operativo, pero incluso eso no es necesario con el clip. Paperclip::Attachment is already an IOStream.

Sólo se necesita :body => asset así:

touchpoint.assets.each do |asset| 
    attachment :content_type => asset.file_content_type, 
      :body => asset 
end 
4
request.env["HTTP_HOST"] 

No sé por qué esto una línea de código es tan difícil de alcanzar en la web. Parece que debería estar al frente y al centro.

+0

Funcionaba muy bien hasta que traté de usarlo en un anuncio publicitario de rieles, y encontré este 'método indefinido 'env' para nil : NilClass' por lo que no funciona en todas partes –

+0

Por lo que sé, el objeto 'request' no existe en los anuncios publicitarios. Es por eso que debe definir específicamente un valor para el host. No estoy seguro de por qué esto sigue siendo votado – wuliwong

+0

** ¡Esto no es seguro! ** El encabezado "HTTP_HOST" es establecido por el usuario, y un usuario malintencionado podría cambiarlo a cualquier cosa que desee al enviar una solicitud. Esto podría significar que los enlaces de restablecimiento de contraseña cou Se enviará al servidor de otra persona, o se pueden cambiar las imágenes, etc. ** NO UTILICE ESTO ** –

Cuestiones relacionadas