2009-10-02 4 views
9

J'utilise Paperclip pour permettre aux utilisateurs de joindre des choses, puis j'envoie un courriel et je souhaite joindre le fichier au courriel. Je suis en train de lire le fichier et l'ajouter comme une pièce jointe, comme ceci:Comment puis-je obtenir l'URL de base (par exemple http: // localhost: 3000) de mon application 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 

Cela me donne l'erreur suivante No such file or directory - /system/files/7/original/image.png?1254497688 la trace de la pile en disant qu'il est l'appel à File.read. Lorsque je visite la page show.html.erb, et cliquez sur le lien vers l'image, qui est quelque chose comme http://localhost:3000/system/files/7/original/image.png?1254497688, l'image est affichée très bien.

Comment puis-je résoudre ce problème?

Répondre

4

asset.url Renvoie l'URL du fichier. Ceci est généralement /system/classname/xx/xx/style/filename.ext. Vous mettriez cela dans un image_tag.

Vous voulez asset.path. Il renvoie le chemin d'accès complet au fichier, qui sera généralement quelque chose comme /home/username/railsapp/public/system/classname/xx/xx/style/filename.ext

HTH.

+1

Merci pour cela - passer des âges à la recherche de ce conseil exactement ... – snowangel

20

Typiquement root_url devrait fournir ceci. File.read attend un chemin de fichier, pas une adresse URL. Si vous générez les images, vous devez appeler le code de génération d'image et renvoyer les octets de l'image générée au lieu d'appeler File.read(…)

+0

Je ne les génère pas, je laisse l'utilisateur les télécharger et les stocker sur le système de fichiers –

+0

Mais quand je spécifie le chemin de fichier (via la méthode asset.url), j'obtiens une erreur disant qu'il ne peut pas trouver le fichier; Cependant, lorsque je crée un lien (par exemple, link_to asset.name, asset.url), cela fonctionne très bien et je peux voir l'image. –

+0

Essayez 'File.read (File.join (Rails.root," public ", asset.url))' (en supposant que les images sont sur le système de fichiers sous 'public/system/files/...'. – cwninja

1

comme ZiggyTheHamster est dit: le asset.url est l'URL générée qui serait utilisé sur les pages Web

(ce qui est la raison pour laquelle vous obtenez les barres obliques de répertoire de style unix, comme l'a souligné dans les commentaires.) asset.path devrait vous donner le chemin d'accès au fichier, mais même cela n'est pas nécessaire avec trombone. Paperclip::Attachment is already an IOStream.

Vous avez juste besoin :body => asset comme ceci:

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

Je ne sais pas pourquoi une ligne de code est si difficile à atteindre sur le web. On dirait que ça devrait être à l'avant et au centre.

+0

Il fonctionnait très bien jusqu'à ce que j'ai essayé de l'utiliser dans un courrier de rails, et a couru dans cette 'méthode non définie 'env' pour néant : NilClass' donc ça ne marche pas partout –

+0

Pour autant que je sache, l'objet 'request' n'existe pas dans les mailers, c'est pourquoi vous devez définir spécifiquement une valeur pour host. ** – wuliwong

+0

** Ceci n'est pas sûr! ** L'en-tête "HTTP_HOST" est défini par l'utilisateur, et un utilisateur malintentionné peut le changer pour tout ce qu'il veut en soumettant une requête. Peut être envoyé au serveur de quelqu'un d'autre, ou les images pourraient être changées, etc. ** N'UTILISEZ PAS CETTE ** –

Questions connexes