Renderer: rendering to *another* format inside a renderer

My skeletal renderer looks like this

  ActionController.add_renderer :pdf do |template, options|
    html = render_to_string(template, options)
    ...
  end

The trouble here is that render_to_string looks for a template for MIME
type PDF, e.g. show.pdf.erb. Unfortunately, that's not what I want. I
need to get HTML. I haven't found a straightforward option to achieve
this.

  html = render_to_string(options.merge(
    :template => "#{template}.html")

That's not pretty, but gets me halfway there. However, when I call

  render :pdf => 'show', :layout => 'print'

the layout is passed through to render_to_string, but ignored. If I
rename layouts/print.html.erb to layouts/print.pdf.erb, it works as long
as all partials used by that layout are available in pdf variants, too.

Now, I see that this behavior might be useful most of the time, but this
time it is exactly not what I want. Is there a *clean* way to make
render_to_string do what I want?

Michael

Michael Schuerig wrote:

My skeletal renderer looks like this

  ActionController.add_renderer :pdf do |template, options|
    html = render_to_string(template, options)
    ...
  end

The trouble here is that render_to_string looks for a template for MIME
type PDF, e.g. show.pdf.erb. Unfortunately, that's not what I want. I
need to get HTML.

WTF? What problem are you trying to solve that means you need to serve
HTML when a PDF file is requested? I don't see how that can ever be the
right thing to do.

I'm passing the HTML into an HTML-to-PDF converter. wkhtmltopdf in my
case. wicked_pdf does the same, but it works by alias_chain-ing render,
which I'd like to avoid. Instead, I'm defining a renderer. See

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

Michael