21

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

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

这是我以前做的:

InvoicesController < ApplicationController
  def download
    kit = PDFKit.new(render_to_string(:show, :layout => 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")

任何人都可以帮忙吗?

4

6 回答 6

31

Rails.application.assets文档记录很差,但它提供了作为对象访问 Rails 到 Sprockets 中的钩子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']
  # => #<Sprockets::BundledAsset ...>

调用to_s生成的资产以访问其内容,length以字节为单位获取其长度,mtime查询其最后修改时间,并pathname获取其在文件系统上的完整路径。

于 2012-03-20T01:21:19.497 回答
13

view_context.asset_path 'application.css'应该做的伎俩。

于 2011-10-07T14:08:49.097 回答
9

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

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

<style> <%= Rails.application.assets["application.css"].to_s %> </style>

于 2014-11-10T05:28:55.677 回答
4

一种解决方案是将 CSS 内联到您的视图中。

在 HAML 中,这可能如下所示:

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

或在 ERB 中:

<style>
  <%= Sass.compile(File.read(File.join(Rails.root, 'app', 'assets', 'stylesheets', 'sass', "application.scss"))) %>
</style>
于 2011-09-14T16:11:06.473 回答
0

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

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

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

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

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

config.assets.digests[css_file_name_as_string]

于 2011-09-27T05:50:23.027 回答
-2

我认为stylesheet_path("application")是您正在寻找的

于 2011-09-14T02:48:16.657 回答