Rails 3.1资产管道与PDFKit

8
我正在使用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文件?

我知道我可以使用Rack中间件和PDFkit将PDF渲染到浏览器中,但在这种情况下,我需要将PDF发送给第三方传真服务。

感谢您的帮助。

Ryan


可能是如何在Rails 3.1中从控制器引用已编译的资源?的重复问题。 - Nathan Hughes
7个回答

3

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

我猜LESS和SCSS文件不会像通过asset pipeline访问时那样被处理。

      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。 - Kris

1

虽然有点晚了,但总比不做好。

我会这样做:

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

仍然是 Errno::ENOENT - 没有这个文件或目录 - Rajesh Omanakuttan

0

0

尝试一下

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


4
请问您能否提供更多细节?另外,由于这篇文章是更新旧帖子,与之前的答案相比,能否解释一下新的解决方案呢? - amanin

0

你有成功改进这个解决方案吗?并使用资产管道生成PDF文件? - Don Giulio

0
在Rails 3.1.1中,样式表以及其摘要指纹会被写入/public/assets。
这意味着您只需更改代码中的路径即可引用这些文件。
但是有一个注意点:如果PDF表格未在CSS清单中引用,则必须将其添加到预编译配置中:
``` config.assets.precompile += ['trade_request.css'] ```
这告诉sprockets单独编译该文件。
作为(更好的)替代方案,请查看asset_path助手是否适用于您的代码。 这将在开发和生产环境中引用正确的文件。

感谢您的回复。我只是使用application.css文件,因此我不认为我需要担心预编译。我相信pdfkit运行一个单独的进程,因此当我引用路径时没有文件末尾的哈希,它无法找到它。例如,这个可以工作:kit.stylesheets << "#{Rails.root.to_s}/public/assets/application-5c342d3a7328fd347c8ca581f6bdff60.css"这个则不行:kit.stylesheets << "#{Rails.root.to_s}/public/assets/application.css"有没有办法获取正确的文件路径?谢谢! - lundie

-1

你应该能够使用这种方法访问样式表:

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") 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接