2017-04-17 1 views
4

J'essaye d'envoyer une pièce jointe d'email using l'expéditeur d'action dans le ruby ​​sur des rails et je continue à obtenir cette erreur. Le problème semble être qu'il ne peut pas localiser le fichier dans le répertoire que j'ai spécifié, mais le chemin du fichier est valide. J'ai également vérifié ceci en utilisant File.exist? dans la console et ai confirmé que le chemin fourni évalue à vrai.Errno :: ENOENT - Pas de tel fichier ou répertoire @ rb_sysopen

Voici mon logiciel de messagerie:

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 

J'ai aussi installé le petit bijou de messagerie pour gérer le codage, comme conseillé par la documentation Mailer action.

Toute aide serait appréciée, -Brian

+0

Cela peut aider https://stackoverflow.com/questions/6566884/rubys-file-open-donne-aucun-tel-fichier-ou-répertoire-texte-txt-errnoenoent-er –

+0

https://stackoverflow.com/questions/15605782/errnoenoent-no-such-file -or-directory-ruby –

Répondre

6

Rails.root retourne un objet Pathname. Pathname#+(string)File.join le string au chemin s'il est relatif; si string représente un chemin absolu (c'est-à-dire commence par une barre oblique), le chemin devient remplacé.

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

Cela signifie, vous lisez le mauvais chemin: vous vouliez lire /path/to/app/public/albums/files.zip, mais vous lisez en fait /public/albums/files.zip, ce qui ne devrait pas exister probable.

Solution: assurez-vous apposent le chemin relatif:

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

Cela a fonctionné parfaitement! Merci beaucoup pour l'aide! – bdowe

+0

@bdowe Je pense que vous devriez marquer cette réponse avec une coche (comme je le veux dire)! –

-1

Rails.root retourne l'objet chemin. Vous avez donc besoin toconvert à chaîne pour concaténer avec une autre chaîne comme suit: (Rails.root.to_s + « /public/albums/files.zip »)