Come faccio a ottenere l'URL di base (ad esempio, http: // localhost: 3000) del mio Rails app?
-
19-09-2019 - |
Domanda
sto usando Paperclip per consentire agli utenti di collegare le cose, e poi sto inviando una e-mail e di voler allegare il file al messaggio di posta elettronica. Sto cercando di leggere il file e aggiungerlo come allegato, in questo modo:
# 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
Questo mi dà il seguente errore No such file or directory - /system/files/7/original/image.png?1254497688
con l'analisi dello stack dicendo che è la chiamata a File.read
. Quando visito pagina show.html.erb
, e fare clic sul link per l'immagine, che è qualcosa di simile http://localhost:3000/system/files/7/original/image.png?1254497688
, l'immagine viene visualizzata bene.
Come posso risolvere questo problema?
Soluzione
asset.url
restituisce l'URL del file. Questo è di solito /system/classname/xx/xx/style/filename.ext
. Faresti mettere questo in un image_tag
.
Si desidera asset.path
. Si restituisce il percorso completo del file, che di solito è qualcosa di simile a /home/username/railsapp/public/system/classname/xx/xx/style/filename.ext
HTH.
Altri suggerimenti
In genere root_url
dovrebbe fornire questo.
File.read si aspetta un percorso di file, non un URL però. Se si sta generando le immagini, è necessario chiamare il codice di generazione di immagine e restituire i byte l'immagine generata invece di chiamare File.read(…)
request.env["HTTP_HOST"]
Non so il motivo per cui questa riga di codice è così sfuggente sul web. Sembra che dovrebbe essere fino davanti e al centro.
come ZiggyTheHamster sta dicendo: (. Ed è per questo che stai ricevendo la directory barre di tipo UNIX, come sottolineato nei commenti) l'asset.url è l'URL generato che sarebbe stato utilizzato su pagine web
asset.path dovrebbe darvi il percorso OS-aware al file, ma anche questo non è necessaria con graffetta. Paperclip :: L'attaccamento è già un iostream.
Hai solo bisogno :body => asset
in questo modo:
touchpoint.assets.each do |asset|
attachment :content_type => asset.file_content_type,
:body => asset
end