【问题标题】:render_to_string does not find partials (PDFKit controller response)render_to_string 未找到部分(PDFKit 控制器响应)
【发布时间】:2011-07-20 22:40:44
【问题描述】:

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 的部分程序/详细信息]}

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

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 一起工作的原始问题的任何答案仍然值得赞赏。

【问题讨论】:

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


    【解决方案1】:

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

    控制器摘录:

    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 需要文件扩展名?这对我来说已经解决了!

    【讨论】:

      【解决方案2】:

      您还可以将:formats 设置为render_to_string,以避免更改部分名称。

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

      这会强制使用 html 而不是 pdf 格式来呈现剩余的视图。允许您在不更改 HTML 和 PDF 响应的情况下使用相同的视图/部分。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 如果需要传入locals和layout=false怎么办?
        猜你喜欢
        • 2023-03-05
        • 1970-01-01
        • 2018-09-24
        • 2021-12-11
        • 1970-01-01
        • 2019-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多