Asking Rails 3 to render a pdf from a file but getting template error instead

Why is Rails looking for a template while I have told it to render a specific file? This worked under Rails 2. I read http://www.engineyard.com/blog/2010/render-options-in-rails-3/ which from I gather makes any format.xxx look for a template xxx which is not what I need to do as the file is created dynamically:

In my controller:

pdf_file_path = "./directory/file_name.pdf"  # just an example, assume this file exists
respond_to do |format|
  format.pdf { render :file => pdf_file_path }

end

But I get:

ActionView::MissingTemplate (Missing template comparisons/display with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml], :formats=>[:pdf], :locale=>[:en, :en]} in view paths “/Users/DK/Documents/ror/projects/creditcompare3/app/views”):

Is there a way / better way to do this?

I think you misunderstand that article.

Looks to me that instead of passing css filenames into the
"ActionController.add_renderer" block, you could just as easily pass
your actual dynamically generated PDF, and then have the "send_data"
call send your file.

But I agree, it's certainly easier the just "render :file => foo_bar"
- which I do in some of my controller actions, and I've not moved to
Rails3 yet, so I'll be interested in your result.

I think that you’re looking for either send_file or send_data depending on how you create the PDF. If there actually is a file, then send_file will be what you want. If you still have the data in memory, then send_data(stuff) is similar to render(:text => stuff)

-Rob

Rob Biedenharn

Rob@AgileConsultingLLC.com http://AgileConsultingLLC.com/

rab@GaslightSoftware.com http://GaslightSoftware.com/

Why is Rails looking for a template while I have told it to render a

specific file? This worked under Rails 2. I read

http://www.engineyard.com/blog/2010/render-options-in-rails-3/ which from I

gather makes any format.xxx look for a template xxx which is not what I

need to do as the file is created dynamically:

I think you misunderstand that article.

Looks to me that instead of passing css filenames into the

“ActionController.add_renderer” block, you could just as easily pass

your actual dynamically generated PDF, and then have the “send_data”

call send your file.

Thanks Michael and Rob - you got me through this. The following works:

send_file “#{TEMP_DIRECTORY}/#{comparison.id}_#{params[:view]}.pdf”, :stream => false, :type => ‘application/pdf’, :disposition => ‘inline’

But I agree, it’s certainly easier the just “render :file => foo_bar”

Right. I know there must be a good reason for a lot of these changes and at some point it will all come together the ponies and rainbows will appear. I am waiting semi-patiently for this moment :slight_smile: