0

Railsでサイトビルダーに取り組んでおり、SprocketsSCSSプロセッサを使用してサイトをcssでレンダリングしたいと思います。ユーザーは色やロゴを変更できるため、Sprocketsのプリコンパイルを使用できないため、動的ビューを処理するためのRailsS​​CSSテンプレートハンドラーの作業を開始しました。

目標は、/ sites/43543.cssが要求されたときにいつでも「app/views / sites/show.css.scss」をコンパイルすることです。これが私がこれまでに持っているものです。最初にERBプロセッサを介してテンプレートを実行し、次にSprocketsを介して実行しようとしていることに気付くでしょう。

https://gist.github.com/3870095

Manuel Meurerは、ERB出力をパスに書き込み、アセットパイプラインをトリガーしてコンパイルする代替ソリューションを考案しました。彼のソリューションをローカルで機能させることはできましたが、アセットパスが書き込み可能ではないため、herokuでは機能しません。ファイルはtmpディレクトリにのみ書き込むことができ、それらのファイルは1回のリクエストに対してのみ保証されます。

http://www.krautcomputing.com/blog/2012/03/27/how-to-compile-custom-sass-stylesheets-dynamically-during-runtime/

4

1 に答える 1

2

長い一日の後、John Feminella と彼の google への投稿のおかげで、問題を解決することができました。私にとって難しかったのは、新しい Sprockets::Context を作成する方法を見つけることでした。幸いなことに、John のソリューションは Context を必要としません。

更新された要旨はこちら

試み #1

このコードでは、アセット パイプラインから css ファイルをインポートできません。

@import "foundation";基礎がコンパスモジュールとしてロードされているため機能します

@import "custom_css";ファイルが見つからないというエラーメッセージが表示される

def call(template)
  erb = ActionView::Template.registered_template_handler(:erb).call(template)

  %{ 
    options = Compass.configuration.to_sass_engine_options.merge(
      :syntax => :scss,
      :custom => {:resolver => ::Sass::Rails::Resolver.new(CompassRails.context)},
    )
    Sass::Engine.new((begin;#{erb};end), options).render
  }
end

試み #2

このコードは、asset-data-url を使用して base64 URL を埋め込むことができません

  def call(template)
    erb = ActionView::Template.registered_template_handler(:erb).call(template)

    %{
      compiler = Compass::Compiler.new *Compass.configuration.to_compiler_arguments
      options  = compiler.options.merge({
        :syntax => :scss,
        :custom => {:resolver => ::Sass::Rails::Resolver.new(CompassRails.context)},
      })
      Sass::Engine.new((begin;#{erb};end), options).render
    } 
  end

試行 3

コンテキストの作成中に空の値を使用できることがわかりました。以下のコードは開発では機能しますが、本番環境ではエラーがスローされます。

ActionView::Template::Error (can't modify immutable index)

Sprockets::Environment の代わりに使用される Sprockets::Index でエラーが発生しているようです。Sprockets::Environment に切り替えても問題は解決しません。

  def call(template)
    erb = ActionView::Template.registered_template_handler(:erb).call(template)

    %{
      context = CompassRails.context.new(::Rails.application.assets, '', Pathname.new(''))
      resolver = ::Sass::Rails::Resolver.new(context)

      compiler = Compass::Compiler.new *Compass.configuration.to_compiler_arguments
      options  = compiler.options.merge({
        :syntax => :scss,
        :custom => {:resolver => resolver}
      })

      Sass::Engine.new((begin;#{erb};end), options).render
    }
  end
于 2012-10-11T06:10:58.260 に答える