render_to_string找不到partials(PDFKit控制器响应)

时间:2011-03-23 00:19:44

标签: ruby-on-rails pdfkit render-to-string

Ruby 1.8.7,Rails 3.0.4,PDFKit 0.5.0

我正在尝试使用PDFKit创建PDF而不使用中间件,因此我可以禁用javascript(那里有一个手风琴动作,隐藏了大量应该在PDF上的信息)。但是,每当我尝试时,它都会失败,因为它说我视图中的部分(show.html.erb)丢失了:

  

使用{:locale => [:en,:en],:formats => [:pdf],:handlers => [:erb,:rjs,:builder,:rhtml)缺少部分程序/详细信息,:rxml]}

如果删除对partials的引用,它可以正常工作。我也尝试将部分与show.html.erb放在同一目录中无济于事。这是我的控制器的show动作中的代码:

respond_to do |format| 
  format.html # show.html.erb 
  format.pdf {
    html = render_to_string(:template => "show.html.erb")
    kit = PDFKit.new(html, :disable_javascript => true )
    send_data(kit.to_pdf, :filename => "test_pdf", :type => "application/pdf", :disposition => 'attachment')
  }
end

有没有办法做到这一点并保留部分内容?

编辑:现在我已经这样做了:

# config/initializers/pdfkit.rb
PDFKit.configure do |config|
  config.default_options = {
    :page_size => 'Legal',
    :print_media_type => true,
    :disable_javascript => true
  }
end

这样做的缺点是为我生成的每个PDF关闭了javascript,但它现在就可以了。仍然可以通过render_to_string获得关于使部分工作仍然有效的原始问题的任何答案。

3 个答案:

答案 0 :(得分:20)

今天早上我遇到了这个问题,并在寻找解决方案时遇到了你的问题。

控制器提取:

respond_to do |format|
  format.html
  format.pdf {
    html = render_to_string(:layout => false , :action => "constitution.pdf.haml")
    kit = PDFKit.new(html)
    kit.stylesheets << "#{Rails.root}/public/stylesheets/pdf.css"
    send_data(kit.to_pdf, :filename => "#{@organisation_name} Constitution.pdf",
      :type => 'application/pdf', :disposition => 'inline')        
    return
  }
end

constitution.pdf.haml提取:

=render :partial => 'shared/constitution'

错误:

Missing partial shared/constitution with {:locale=>[:en, :e   ...

过了一会儿撞到墙上,我猜了一下,并将constitution.pdf.haml更改为:

=render :partial => 'shared/constitution.html.haml'

我只知道关于Rails的一小部分内容。难道真的那样(不像我正常的Haml视图),PDFKit需要文件扩展吗?这对我来说是固定的!

答案 1 :(得分:3)

您还可以为:formats设置render_to_string,以防止更改部分名称。

html = render_to_string(:layout => false , :action => "show", :formats => :html)

这会强制html,而不是pdf,格式为视图渲染的剩余部分。允许您使用相同的视图/部分而不更改HTML和PDF响应。

答案 2 :(得分:1)

我应该指定模板的完整路径:

html = render_to_string(:template => "my_view_folder_name/show.html.erb")