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 がファイルの有効な名前ではなくなったことは言うまでもありません。SCSS ファイルのマニフェストとして機能する app/assets/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")

誰でも助けることができますか?

4

6 に答える 6

31

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']
  # => #<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

1 つの解決策は、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 に答える