mileszs / wicked_pdf

PDF generator (from HTML) plugin for Ruby on Rails
http://www.mileszs.com/wicked-pdf-plugin
MIT License
3.52k stars 640 forks source link

undefined method `empty?' for nil:NilClass When file Option is Used With header and footer Options #926

Open sshaw opened 4 years ago

sshaw commented 4 years ago

Issue description

See title. This NoMethodError is never propagated to the caller. I had to do some debugging:

/Users/sshaw/.rvm/gems/ruby-2.5.7@qms/gems/actionview-5.2.3/lib/action_view/lookup_context.rb:206:in `normalize_name'
/Users/sshaw/.rvm/gems/ruby-2.5.7@qms/gems/actionview-5.2.3/lib/action_view/lookup_context.rb:155:in `args_for_lookup'
/Users/sshaw/.rvm/gems/ruby-2.5.7@qms/gems/actionview-5.2.3/lib/action_view/lookup_context.rb:121:in `find_file'
/Users/sshaw/.rvm/gems/ruby-2.5.7@qms/gems/actionview-5.2.3/lib/action_view/renderer/abstract_renderer.rb:20:in `find_file'
/Users/sshaw/.rvm/gems/ruby-2.5.7@qms/gems/actionview-5.2.3/lib/action_view/renderer/template_renderer.rb:32:in `block in determine_template'
/Users/sshaw/.rvm/gems/ruby-2.5.7@qms/gems/actionview-5.2.3/lib/action_view/lookup_context.rb:147:in `with_fallbacks'
/Users/sshaw/.rvm/gems/ruby-2.5.7@qms/gems/actionview-5.2.3/lib/action_view/renderer/abstract_renderer.rb:20:in `with_fallbacks'
/Users/sshaw/.rvm/gems/ruby-2.5.7@qms/gems/actionview-5.2.3/lib/action_view/renderer/template_renderer.rb:32:in `determine_template'
/Users/sshaw/.rvm/gems/ruby-2.5.7@qms/gems/actionview-5.2.3/lib/action_view/renderer/template_renderer.rb:10:in `render'
/Users/sshaw/.rvm/gems/ruby-2.5.7@qms/gems/actionview-5.2.3/lib/action_view/renderer/renderer.rb:44:in `render_template'
/Users/sshaw/.rvm/gems/ruby-2.5.7@qms/gems/actionview-5.2.3/lib/action_view/renderer/renderer.rb:25:in `render'
/Users/sshaw/.rvm/gems/ruby-2.5.7@qms/gems/actionview-5.2.3/lib/action_view/rendering.rb:103:in `_render_template'
/Users/sshaw/.rvm/gems/ruby-2.5.7@qms/gems/actionpack-5.2.3/lib/action_controller/metal/streaming.rb:219:in `_render_template'
/Users/sshaw/.rvm/gems/ruby-2.5.7@qms/gems/actionview-5.2.3/lib/action_view/rendering.rb:84:in `render_to_body'
/Users/sshaw/.rvm/gems/ruby-2.5.7@qms/gems/actionpack-5.2.3/lib/action_controller/metal/rendering.rb:52:in `render_to_body'
/Users/sshaw/.rvm/gems/ruby-2.5.7@qms/gems/actionpack-5.2.3/lib/action_controller/metal/renderers.rb:142:in `render_to_body'
/Users/sshaw/.rvm/gems/ruby-2.5.7@qms/gems/actionpack-5.2.3/lib/abstract_controller/rendering.rb:46:in `render_to_string'
/Users/sshaw/.rvm/gems/ruby-2.5.7@qms/gems/actionpack-5.2.3/lib/action_controller/metal/rendering.rb:41:in `render_to_string'
/Users/sshaw/.rvm/gems/ruby-2.5.7@qms/gems/wicked_pdf-1.4.0/lib/wicked_pdf/pdf_helper.rb:69:in `call'
/Users/sshaw/.rvm/gems/ruby-2.5.7@qms/gems/wicked_pdf-1.4.0/lib/wicked_pdf/pdf_helper.rb:69:in `render_to_string_with_wicked_pdf'
/Users/sshaw/.rvm/gems/ruby-2.5.7@qms/gems/wicked_pdf-1.4.0/lib/wicked_pdf/pdf_helper.rb:34:in `render_to_string'
/Users/sshaw/.rvm/gems/ruby-2.5.7@qms/gems/wicked_pdf-1.4.0/lib/wicked_pdf/pdf_helper.rb:153:in `block in prerender_header_and_footer'
/Users/sshaw/.rvm/gems/ruby-2.5.7@qms/gems/wicked_pdf-1.4.0/lib/wicked_pdf/pdf_helper.rb:139:in `each'
/Users/sshaw/.rvm/gems/ruby-2.5.7@qms/gems/wicked_pdf-1.4.0/lib/wicked_pdf/pdf_helper.rb:139:in `prerender_header_and_footer'
/Users/sshaw/.rvm/gems/ruby-2.5.7@qms/gems/wicked_pdf-1.4.0/lib/wicked_pdf/pdf_helper.rb:101:in `make_pdf'
/Users/sshaw/.rvm/gems/ruby-2.5.7@qms/gems/wicked_pdf-1.4.0/lib/wicked_pdf/pdf_helper.rb:130:in `make_and_send_pdf'
/Users/sshaw/.rvm/gems/ruby-2.5.7@qms/gems/wicked_pdf-1.4.0/lib/wicked_pdf/pdf_helper.rb:40:in `render_with_wicked_pdf'
/Users/sshaw/.rvm/gems/ruby-2.5.7@qms/gems/wicked_pdf-1.4.0/lib/wicked_pdf/pdf_helper.rb:30:in `render'
/Users/sshaw/code/ruby/qms/app/controllers/exports_controller.rb:43:in `block (2 levels) in show'
/Users/sshaw/.rvm/gems/ruby-2.5.7@qms/gems/actionpack-5.2.3/lib/action_controller/metal/mime_responds.rb:203:in `respond_to'
...

It only seems to occur when the aforementioned options are combined.

Expected or desired behavior

It's not clear from the docs that these cannot be used together (really makes sense for header/footer to support file option too) but if they cannot a check should be made and an ArgumentError raised. Exception should definitely not be swallowed which appears to be happing now as prior to debugging my logs contained nothing and action returned a 0-sized PDF response.

System specifications

wicked pdf 1.4.0 but seems to occur in 2.1. Since error is not propigated not 100% as I get error rendering but did not debug under 2.1

wkhtmltopdf version (output of wkhtmltopdf --version): wkhtmltopdf 0.12.5 (with patched qt)

platform/distribution and version (e.g. Windows 10 / Ubuntu 16.04 / Heroku cedar):

Darwin XXXXXX 18.6.0 Darwin Kernel Version 18.6.0: Thu Apr 25 23:16:27 PDT 2019; root:xnu-4903.261.4~2/RELEASE_X86_64 x86_64
unixmonkey commented 4 years ago

Can you provide more information for reproduction? Are you using :file inside or outside of the header/footer options?

sshaw commented 4 years ago

Are you using :file inside or outside of the header/footer options?

It's possible to use file in header/footer? Seems like a no.

The problematic config looks mostly like this:

render pdf: "a_file",
       file: "path/to/a/file",
       header: {
         html: {
           template: "header",
           locals: {
             current_user: current_user,
           }
         }
       },
       footer: {
         html: {
           template: "footer",
           locals: {
             current_user: current_user,
           }
         }
       }

When file is replaced with template or when file is kept and header/footer are removed, it works. Rails 5.2.3