ruby on rails - has_one_attached - problema de implementación de pdf malvado en heroku
rails attachment (4)
Estoy usando esta guía para integrar wicked_pdf en heroku. Pero de alguna manera no parece funcionar. Conseguí los registros de heroku y dice esto:
Processing PdfController#get_pdf to pdf (for 115.248.175.50 at 2011-02-15 23:54:44) [GET]
Parameters: {"format"=>"pdf", "action"=>"get_pdf", "id"=>"1", "controller"=>"pdf"}
***************WICKED***************
Rendering pdf/get_pdf
RuntimeError (PDF could not be generated!
/usr/ruby1.8.7/lib/ruby/1.8/open3.rb:73:in `exec'': No such file or directory - /app/fa369291-829b-4b61-9efe-b2f0d0a0a42c/home/bin/wkhtmltopdf-amd64 - - (Errno::ENOENT)
from /usr/ruby1.8.7/lib/ruby/1.8/open3.rb:73:in `popen3''
from /usr/ruby1.8.7/lib/ruby/1.8/open3.rb:59:in `fork''
from /usr/ruby1.8.7/lib/ruby/1.8/open3.rb:59:in `popen3''
from /usr/ruby1.8.7/lib/ruby/1.8/open3.rb:57:in `fork''
from /usr/ruby1.8.7/lib/ruby/1.8/open3.rb:57:in `popen3''
from /app/fa369291-829b-4b61-9efe-b2f0d0a0a42c/home/vendor/plugins/wicked_pdf/lib/wicked_pdf.rb:22:in `pdf_from_string''
from /app/fa369291-829b-4b61-9efe-b2f0d0a0a42c/home/vendor/plugins/wicked_pdf/lib/pdf_helper.rb:28:in `make_pdf''
from /app/fa369291-829b-4b61-9efe-b2f0d0a0a42c/home/vendor/plugins/wicked_pdf/lib/pdf_helper.rb:39:in `make_and_send_pdf''
from /app/fa369291-829b-4b61-9efe-b2f0d0a0a42c/home/vendor/plugins/wicked_pdf/lib/pdf_helper.rb:13:in `render''
from /app/fa369291-829b-4b61-9efe-b2f0d0a0a42c/home/app/controllers/schedule_controller.rb:33:in `get_pdf''
Por favor ayuda. Gracias por adelantado.
EDITAR:
Hice algunos cambios en mi código y resolví este error, pero todavía me quedé atascado aquí
NoMethodError (undefined method empty? for #<Pathname:0x2b7112392480>)
Busca el binario wicked_pdf en: /app/fa369291-829b-4b61-9efe-b2f0d0a0a42c/home/bin/wkhtmltopdf-amd64
Y no está allí, coloque el binario en una carpeta dentro de su aplicación y luego cambie el archivo config/initializers/wicked_pdf.rb
para incluir:
:exe_path => "#{Rails.root}/path/to/wkhtmltopdf-amd64"
Otro problema al que podría llegar si wicked_pdf crea archivos, es el hecho de que el sistema de archivos Heroku solo se lee, por lo tanto, a menos que encuentre una manera de decirle a wicked_pdf que cree los pdfs en el directorio tmp, es posible que no pueda usarlos.
Después de ver tu parte de edición que dice "¿método indefinido vacío? Para #<Pathname:0x2b...>
Esto significa que estás en algún lugar usando vacío? ¿Funciona en un objeto de ruta mientras que vacío? Es una función de una cadena y no de ruta.
intente averiguar dónde ha utilizado un objeto de ruta de acceso y utilice to_s en ese objeto.
Pruébalo.
Si agrega una copia local de wkhtmltopdf a su repositorio, puede señalarlo así en un inicializador.
PDFKit.configure do |config|
config.wkhtmltopdf = "#{RAILS_ROOT}/lib/wkhtmltopdf"
end
recuerde hacer chmod + x su copia wkhtmltopdf en su repositorio antes de que usted - git agregarlo
Espero que esto ayude.
Cómo conseguir que la gema WickedPdf funcione en Heroku
(ver cita abajo para las urls)
- Crea una carpeta llamada
bin
en la raíz de tu aplicación Rails. - Descargue y extraiga la versión 0.9.9 de los
wkhtmltopdf
binarioswkhtmltopdf
en la carpetabin
. Necesitará la versión para su sistema de desarrollo y la versión AMD64 para Heroku. No agregue a su repositorio git todavía. - Establezca los permisos de ejecución para cada binario en la carpeta
bin
por ejemplo,chmod +x bin/wkhtmltopdf-amd64
- Ahora
git add bin
- Agregue
wicked_pdf
a suGemfile
y labundle install
. No se necesitan otras gemas wkhtmltopdf. - Cree un archivo en la carpeta
config/initializers
llamadawicked_pdf.rb
con el código fuente a continuación. -
git commit -am ''added wkhtmltopdf binaries and wicked_pdf gem''
-
git push heroku
Su proyecto Rails ahora está configurado para Heroku. Desde aquí, agregue la lógica de su programa para archivos PDF.
** config / initializers / wicked_pdf.rb **
if Rails.env.production?
wkhtmltopdf_path = "#{Rails.root}/bin/wkhtmltopdf-amd64"
else
# Linux (check your processor for Intel x86 or AMD x64)
# wkhtmltopdf_path = "#{Rails.root}/bin/wkhtmltopdf-amd64"
# wkhtmltopdf_path = "#{Rails.root}/bin/wkhtmltopdf-i386"
# OS X
wkhtmltopdf_path = "#{Rails.root}/bin/wkhtmltopdf-0.9.9-OS-X.i386"
# Windows
# wkhtmltopdf_path = ''C:/Program Files/wkhtmltopdf/wkhtmltopdf.exe''
end
WickedPdf.config = { exe_path: wkhtmltopdf_path, wkhtmltopdf: wkhtmltopdf_path }
Cómo llegué a esta conclusión:
Para empezar, hay VARIOS artículos wkhtmltopdf
en la Web sobre wkhtmltopdf
, la gema wicked_pdf
y Heroku
. También hay problemas con las versiones recientes de wkhtmltopdf
(10.0+) que hacen que la ejecución se bloquee.
Por último, en algún momento debe haber habido un cambio en los nombres de las variables de configuración para WickedPdf
porque varios artículos hacen referencia a :exe_path
mientras que otros artículos hacen referencia a :wkhtmltopdf
. Incluso la documentación de GitHub de WickedPdf se alterna entre cada variable.
Mi solución no es necesario compilar wkhtmltopdf
desde la fuente. No es necesario instalar wkhtmltopdf
desde Homebrew. Le proporcioné la solución a esto si realmente desea brew install wkhtmltopdf
. Tampoco es necesario que agregues ninguna de las gemas de ayuda ''wkhtmltopdf'' a tu proyecto. wkhtmltopdf
, wkhtmltopdf-heroku
, wkhtmltopdf-engineyard
, wkhtmltopdf-binary
gems y los wkhtmltopdf-binary
GitHub. Funcionó muy bien a nivel local. No hay suerte en Heroku.
Desde una consola Rails en Heroku: investigué qué CPU estaba ejecutando los servidores de Heroku ejecutando RUBY_PLATFORM
que produjo "x86_64-linux"
. También eché un vistazo dentro de la carpeta bin
en Heroku emitiendo Dir.entries(''bin'')
para ver qué archivos existen realmente allí. Noté que algunas de las gemas wkhtmltopdf
que estaba probando colocaron sus ejecutables en esta carpeta. ¡Una pista! Corrí WickedPdf.new.pdf_from_string(''Hello'')
para ver los errores de salida y probar varias configuraciones de WickedPdf.
Luego, en la respuesta de PDFKit
a la configuración de PDFKit
, hay una nota que dio la clave definitiva. Debe dar a los permisos de ejecución de Unix a wkhtmltopdf
el binario antes de comprometerse con Git. ¡Bingo!
Citar:
- Binarios estáticos oficiales wkhtmltopdf heredados http://wkhtmltopdf.org/old-downloads.html
- wicked_pdf https://github.com/mileszs/wicked_pdf
- PDFKit.config de Barlow https://.com/a/5098984/307308
- Cómo instalar wkhtmltopdf utilizando Homebrew ` https://.com/a/14043085/307308
En el momento de escribir este artículo:
- rieles (3.2.13)
- wicked_pdf (0.9.6)
- wkhtmltopdf (0.9.9)
Enmendado el 2/12/2015
dscout ha desarrollado una gema que abarca los conceptos de mi respuesta. Recomiendo usar la gema si su instancia de Heroku es compatible con paquetes de compilación.
Modificado el 27/03/2015
Otra gema que funciona con Heroku (y sistemas operativos Linux AMD64) wkhtmltopdf-heroku automáticamente si hay instaladas las gemas pdfkit, wicked_pdf y wisepdf.