ruby-on-rails - thoughtbot - paperclip validates
Obtener URL absoluta para adjuntar clip (7)
De acuerdo con este problema de github , es más limpio usar ActionController::Base.asset_host
por lo que resultaría en la ayuda:
def add_host_prefix(url)
URI.join(ActionController::Base.asset_host, url)
end
Esto supone que tiene en cada archivo /config/environments/<environment>.rb
lo siguiente:
Appname::Application.configure do
# ....
config.action_controller.asset_host = ''http://localhost:3000'' # Locally
# ....
end
¿Es posible obtener el URI absoluto para un archivo adjunto Paperclip? En este momento, el problema es que el entorno de producción se implementa en un sub-URI (en Passenger: RackBaseURI
), pero <paperclip attachment>.url
devuelve el URI relativo a la aplicación Rails ( /system/images/...
). ¿Hay alguna manera de obtener el URI absoluto para los archivos adjuntos de Paperclip?
Estoy usando Paperclip v2.7 y Rails 3.2.8.
Esto no resuelve exactamente el problema del póster original (funciona en la vista, no en el modelo), pero puede ser útil para las personas que intentan "obtener la URL absoluta para el archivo adjunto del clip" en su vista: de la misma manera que
image_tag(user.avatar.url(:large))
pone la imagen en tu vista,
image_url(user.avatar.url(:large))
devuelve solo la URL que necesitará si desea enlazar directamente con el activo (por ejemplo, en una llamada link_to
).
La forma más ampliamente aplicable de hacer esto es definir primero sus hosts de activos en el archivo de configuración / entorno relevante:
config.action_controller.asset_host = "http://assethost.com"
config.action_mailer.asset_host = "http://assethost.com"
Luego en vistas y anuncios publicitarios:
asset_url(model.attachment.url(:style))
En la consola:
helper.asset_url(model.attachment.url(:style))
En un modelo:
ApplicationController.helpers.asset_url(model.attachment.url(:style))
Puede agregarlo a su application.rb
(o para un entorno específico en config/environments/*
):
config.paperclip_defaults = {
url: "http://my.address.com/system/:class/:attachment/:id_partition/:style.:extension",
path: '':rails_root/public/system/:class/:attachment/:id_partition/:style.:extension'',
}
Reinicia y reimporta tus imágenes.
PD: obviamente puedes reemplazar http://my.address.com con una variable de entorno.
Puedes hacerlo:
<%= image_tag "#{request.protocol}#{request.host_with_port}#{@model.attachment_name.url(:attachment_style)}" %>
O haz un método de ayuda para envolverlo.
def absolute_attachment_url(attachment_name, attachment_style = :original)
"#{request.protocol}#{request.host_with_port}#{attachment_name.url(attachment_style)}"
end
Y úsalo así:
<%= image_tag absolute_attachment_url(attachment_name, :attachment_style)}" %>
Ejemplo: Modelo = Persona (@person), nombre_ajunto = avatar, estilo =: pulgar
<%= image_tag absolute_attachment_url(@person.avatar, :thumb)}" %>
tratar
URI.join(request.url, @model.attachment_name.url)
o
URI(request.url) + @model.attachment_name.url
Es seguro si usas S3 o URL absoluta.
Actualización: esta respuesta es mejor que la mía;) https://.com/a/21027839/683157
asset_url(model.attachment_name.url(:style))