9
votes

Comment obtenir l'URL de base (E.G. http: // localhost: 3000) de mes rails app?

J'utilise PaperClip pour permettre aux utilisateurs de joindre des objets, puis j'envoie un email et je voulais joindre le fichier à l'e-mail. J'essaie de lire le fichier dans et de l'ajouter sous la forme d'une pièce jointe, comme: xxx

Cela me donne l'erreur suivante Aucun fichier ou répertoire de ce type / système / fichiers / 7 / Original / Image.png? 1254497688 Avec la trace de la pile disant que c'est l'appel à fichier.lead . Lorsque je visiterai la page show.html.erb , puis cliquez sur le lien vers l'image, qui est quelque chose comme http: // localhost: 3000 / système / fichiers / 7 / Original / image.png? 1254497688 , l'image est affichée bien.

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


0 commentaires

4 Réponses :


22
votes

typiquement root_url devrait fournir ceci.

fichier.Lead attend un chemin de fichier, pas une URL cependant. Si vous générez les images, vous devez appeler le code de génération d'images et renvoyer les octets de l'image générée au lieu d'appeler fichier.read (...)


9 commentaires

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


Mais quand je spécifie le fichier FilePath (via la méthode Asset.url), je reçois une erreur en disant qu'il ne peut pas trouver le fichier; Cependant, lorsque je le lie (E.g. link_to Asset.name.name, Asset.url) Cela fonctionne bien et je peux voir l'image.


Essayez fichier.read (fichier.join (rails.root, "public", asset.url)) (en supposant que les images figurent sur le système de fichiers sous public / système / fichiers / ... < / code>.


HMM Le problème semble être la chaîne de caractères qu'il ajoute après le nom de fichier, essayant ce que Cwninja a dit que je reçois l'erreur "argument invalide". Y a-t-il un moyen d'obtenir le chemin de base vers le fichier sans que gobbeldygook après elle?


Asset.url.gsub (/\?.*/, "") comme solution rapide?


(Évidemment, vous devriez envelopper tout ce ick up dans votre modèle, # données peut-être?)


Cela fonctionne, mais maintenant, je reçois une erreur de permission refusée lorsque j'essaie de lire le fichier, bien que les rails aient la permission de sauvegarder le fichier dans le dossier.


L'autorisation refusée semble être dans le répertoire racine (par exemple C: \ Documents \ Wayne \ Projects \ Portail \) mais Rails est capable de faire tout le reste vers ce répertoire. Peut-être que cela a à voir avec le fait que cela se fait via un mailer et non un contrôleur?


Le contrôleur VS du mailer ne doit pas faire de différence. Comme vous êtes sur Windows (BOOOOOOO!), Vous devrez peut-être faire un fichier .read (fichier.join (rails.root, "public", * attes.url.gsub (/\?.*/, " ") .Split (" / ")) . Il peut essayer de lire C: \ Documents \ Wayne \ Projects \ Portail \ Public \ System / Fichiers / 7 / ORI ginal / image.png qui ne ressemble pas à un nom de fichier windows (booooooo!) valide.



4
votes

Asset.url renvoie l'URL dans le 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 complet du fichier, qui sera généralement quelque chose comme /home/username/railsapp/public/system/classname/xx/xx/style/filename.ext

hth.


0 commentaires

1
votes

Comme ZiggyTheHamster dit: l'Aser.url est l'URL générée qui serait utilisée sur les pages Web (c'est pourquoi vous obtenez la répertoire de style UNIX, comme indiqué dans les commentaires.)

ACTIF. Chemin devrait vous donner le chemin d'accès au système d'exploitation au fichier, mais même ce n'est pas nécessaire avec le papier. PaperClip :: La pièce jointe est déjà un iostream.

Vous avez juste besoin de : corps => actif comme: xxx


0 commentaires

3
votes
request.env["HTTP_HOST"]
I don't know why this one line of code is so elusive on the web. Seems like it should be up front and center.

3 commentaires

Cela fonctionnait bien jusqu'à ce que j'essayais de l'utiliser dans un mailer rails et courait dans cette méthode non définie «env» pour Nil: nilclass de sorte que cela ne fonctionne pas partout.


Pour autant que je sache, la demande n'existe pas dans les expéditeurs. C'est pourquoi vous devez définir spécifiquement une valeur pour l'hôte. Vous ne savez pas pourquoi cela continue à être voté?


Ceci est insécurisé! L'en-tête "http_host" est défini par l'utilisateur et un utilisateur malveillant pourrait le changer à tout ce qu'il / elle veut lors de la soumission d'une demande. Cela pourrait signifier que les liaisons de réinitialisation du mot de passe peuvent être envoyées au serveur de quelqu'un d'autre, ou des images pourraient être modifiées, etc. N'utilisez pas ce