如何从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”)就是你要找的东西