【问题标题】:Rails 3.1 asset pipeline with PDFKit带有 PDFKit 的 Rails 3.1 资产管道
【发布时间】:2011-11-18 18:48:25
【问题描述】:

我正在使用带有 rails 3.1 的 PDFkit。在过去,我能够使用 render_to_string 函数并从该字符串创建一个 pdf。然后我按如下方式添加样式表。我的问题是我不知道如何从资产管道中访问它们。 (这就是我在 Rails 3.0 中的做法)

html_string = render_to_string(:template => "/faxes/show.html.erb", :layout => 'trade_request')
kit = PDFKit.new(html_string, :page_size => 'Letter')
kit.stylesheets << "#{Rails.root.to_s}/public/stylesheets/trade_request.css"

所以我的问题是如何通过资产管道从控制器直接访问我的 css 文件?

我知道我可以使用带有 PDFkit 的 Rack 中间件将 pdf 呈现到浏览器,但在这种情况下,我需要将 pdf 发送到第三方传真服务。

感谢您的帮助。

瑞恩

【问题讨论】:

标签: ruby-on-rails asset-pipeline pdfkit


【解决方案1】:

我也遇到了这个问题,我没有使用资产管道就解决了这个问题,而是像以前在 /public 中一样直接访问文件。不知道使用这种方法有什么可能的缺点。

我猜 LESS 和 SCSS 文件不会像通过资产管道访问时那样被处理。

      html = render_to_string(:layout => false , :action => 'documents/invoice.html.haml')
      kit = PDFKit.new(html, :encoding=>"UTF-8")
      kit.stylesheets << "#{Rails.root.to_s}/app/assets/stylesheets/pdf_styles.css"
      send_data(kit.to_pdf, :filename => "test_invoice", :type => 'application/pdf')

【讨论】:

  • 我能看到的唯一问题是你不能使用 SASS/LESS,它必须是纯 CSS。
【解决方案2】:

有点晚了,但迟到总比没有好,嗯。

我会这样做:

found_asset = Rails.application.assets.find_asset( "trade_request.css" ).digest_path
kit.stylesheets << File.join( Rails.root, "public", "assets", found_asset )

【讨论】:

  • 还是Errno::ENOENT - No such file or directory
【解决方案3】:

在 Rails 3.1.1 中,样式表被写入 /public/assets 有和没有摘要指纹。

这意味着您应该能够通过更改代码中的路径来引用这些文件。

但有一个问题:如果 CSS 清单中未引用 PDF 表,则必须将其添加到预编译配置中:

config.assets.precompile += ['trade_request.css']

这告诉 sprockets 自行编译该文件。

作为(更好的)替代方案,查看asset_path 帮助程序是否在您的代码中工作。这将在开发和生产中引用正确的文件。

【讨论】:

  • 感谢您的回复。我只是在使用 application.css 文件,所以我相信我不必担心预编译。我相信 pdfkit 运行一个单独的进程,因此当我在文件末尾引用没有哈希的路径时,它找不到它。 IE 这有效:kit.stylesheets
【解决方案4】:

我最终将 css 文件复制到我的公共目录并以与之前使用 rails 3 相同的方式引用它。有关更多信息,请查看此问题:Access stylesheet_link_tag from controller

【讨论】:

  • 您是否设法改进了这个解决方案?并使用资产管道生成 PDF?
【解决方案5】:

我来到这里试图解决这个问题,但似乎没有一个答案能解决我的问题。我发现这个堆栈溢出帖子的公认答案对我有用:

How does one reference compiled assets from the controller in Rails 3.1?

我什至可以通过这种方法提供 .css.erb 文件。

【讨论】:

    【解决方案6】:

    试试

    = stylesheet_link_tag "application", 'data-turbolinks-track': 'reload'

    【讨论】:

    • 你能补充更多细节吗?此外,当它更新旧帖子时,很高兴解释与以前的答案相比有什么新解决方案。
    【解决方案7】:

    您应该能够使用此方法访问样式表:

    ActionController::Base.helpers.asset_path("trade_request.css")

    编写代码:

    html_string = render_to_string(:template => "/faxes/show.html.erb", :layout => 'trade_request') 
    kit = PDFKit.new(html_string, :page_size => 'Letter') 
    kit.stylesheets = ActionController::Base.helpers.asset_path("trade_request.css") 
    

    【讨论】:

      猜你喜欢
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      • 2012-02-04
      • 1970-01-01
      • 2011-11-23
      • 1970-01-01
      • 1970-01-01
      • 2011-10-04
      相关资源
      最近更新 更多