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

cdr*_*ier 21 ruby-on-rails ruby-on-rails-3.1 asset-pipeline

我在我的控制器中使用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
Run Code Online (Sandbox Code Playgroud)

Sass :: Plugin.options [:css_location]现在返回错误的位置,更不用说application.css不再是文件的有效名称.我要指出,我有作为一个清单给我SCSS文件的应用程序/资产/ application.css文件,它在我的意见通过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")
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙吗?

Dav*_*urt 31

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

kit.stylesheets << Rails.application.assets['application.css'].pathname
Run Code Online (Sandbox Code Playgroud)

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

以编程方式访问资产

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

  environment['application.js']
  # => #<Sprockets::BundledAsset ...>
Run Code Online (Sandbox Code Playgroud)

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

  • 它似乎不适用于需要预编译的资产.它只是加载原始文件(在我的例子中是`.scss`). (2认同)

Man*_*rer 13

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

  • 如果您正在尝试检查Rails控制台,`ActionController :: Base.new.view_context.asset_path"application.css"` (6认同)

Lou*_*eau 8

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

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

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


Rya*_*cox -2

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