如何从Rails 3.1中的控制器引用编译资产?

我在我的控制器中使用PDFkit来构建一系列PDF,将它们压缩,然后将它们发送给用户。

为了控制输出样式,我告诉PDFKit在内容生成期间使用哪些样式表。 我需要传递CSS文件的文件引用。 由于Rails现在正在编译和重命名我的样式表,我不知道如何在我的控制器中引用已编译的CSS资源。

这就是我以前做的事情:

InvoicesController  false)) kit.stylesheets << "#{Sass::Plugin.options[:css_location]}/application.css" kit.to_file("#{file_date_string}.pdf") # snip end end 

Sass :: Plugin.options [:css_location]现在返回错误的位置,更不用说application.css不再是文件的有效名称。 我应该提一下,我有一个app / assets / application.css文件作为我的SCSS文件的清单,它通过stylesheet_link_tag()方法在我的视图中正常工作。

基本上我正在寻找的是一个控制器,相当于asset_path(),以便做这样的事情:

 kit = PDFKit.new(render_to_string(:show, :layout => false)) kit.stylesheets << asset_path('application.css') kit.to_file("#{file_date_string}.pdf") 

有人可以帮忙吗?

Rails.application.assets文档很少,但它提供了对Sprockets的Rails钩子的访问,作为Sprockets::Environment对象。 Rails使用Sprockets基本上运行整个资产管道,这是你应该挂钩的地方,如下所示:

 kit.stylesheets << Rails.application.assets['application.css'].pathname 

https://github.com/sstephenson/sprockets说:

以编程方式访问资产

您可以使用find_asset方法(别名为[] )从Sprockets环境中检索资产。 传递它一个逻辑路径,你会得到一个Sprockets::BundledAsset实例:

  environment['application.js'] # => # 

在结果资产上调用to_s以访问其内容,调用length以获取其长度(以字节为单位),使用mtime查询其上次修改时间,使用pathname获取文件系统上的完整路径。

view_context.asset_path 'application.css'应该可以解决问题。

Rails.application.assets['application.css'].pathname总是返回原始资产的原始路径,而不是预编译文件,因此最佳答案对我不起作用。

但是,在捆绑资产而不是pathname上调用to_s似乎正确地返回预编译资产的主体,因此您可以使用内联样式而不是使用kit.stylesheets <<

一种解决方案是在视图中内联CSS。

在HAML中,这可能看起来像:

 %style = Sass.compile(File.read(File.join(Rails.root, 'app', 'assets', 'stylesheets', 'sass', "application.scss"))) 

或在再培训局:

  

获取编译名称的最佳方法是从编译时生成的清单中获取。

您可以创建一个在开发中提供原始名称的控制器方法,然后访问生产中的清单以映射正确的名称。

默认情况下清单的位置是:

File.join(Rails.public_path, config.assets.prefix, 'manifest.yml')

但看起来您可以在config.assets.digests中将其作为哈希访问

config.assets.digests[css_file_name_as_string]

我认为stylesheet_path(“application”)就是你要找的东西