5

Rubyの経験はあまりありません。ファイルシステムではなくデータベースからsassを@インポートしたい。オンラインで例は見つかりませんでした。これをどのように実装すればよいですか。インポータークラスを拡張する必要があるようですが、rubyを理解していないため、ファイルシステムのどこにこのクラスが存在するか(チェックアウトするだけです)、一般的には基本的な手順を知る必要があります。

詳しくは

MySQLデータベースにはsassコンテンツが含まれています。したがって、私のWebアプリケーションでは、ユーザーからsass(文字列として)を受け入れます。これには、たとえば次のようなインポートステートメントが含まれている可能性があります。

@import test.scss
body  { color:red } 

これで、MySQLDBに次のようなものが表示されます

Table  sass_files
column_name             filename  |   content
example row             test.scss |   p {color:blue;}

このインポートを機能させたいのですが、正規表現の一致を実行してユーザー入力からファイル名を取得し、そのファイル名でDBにクエリを実行して、コンテンツを取得できることを確認します。しかし、ruby/sassにファイルシステムの代わりにロードパスとしてDBを使用させる良い方法があることを読みました。

アップデート

だから私はfindメソッドを使ってダミーのカスタムインポータークラスを作成しました

def find(name, options)
  Sass::Engine.new("p { color :blue; }", options)
end

このインポーターをrubyを使用せずにsassロードパスに追加するにはどうすればよいですか?たとえば、sass gemフォルダー内のソースファイルに変更を加えて、このインポーターをlib / sass / importersに追加できますか?

ありがとう

4

2 に答える 2

3

Compassを使用してコンパイルしているため、Compass構成ファイルにカスタムSassインポーターを追加できます。たとえば、を使用してコンパイルすると、ファイルcompass compile -c config.rbに次のようなものが含まれます。config.rb

require File.join(File.dirname(__FILE__), 'importer.rb')
Sass.load_paths << Sass::Importers::Custom.new()

次にimporter.rb、同じディレクトリに、インポーター定義を含めます。

module Sass
    module Importers
        class Custom < Base
            def find(name, options)
                if name == '[globals]'
                    options[:syntax] = :scss
                    options[:filename] = 'globals'
                    options[:importer] = self
                    return Sass::Engine.new("$imported-variable: blue;", options)
                else
                    return nil
                end
            end

            def find_relative(uri, base, options)
                nil
            end

            def key(uri, options)
                [self.class.name + ":" + uri, uri]
            end

            def mtime(uri, options)
                nil
            end

            def to_s
                '[custom]'
            end
        end
    end
end

次に、Sassファイルでインポーターを使用できます。

@import '[globals]';
p {
    color: $imported-variable;
}

もちろん、これは、一致するURIのみを受け入れるダミーの実装です"[globals]"。Rubyでのデータベースアクセスの経験がないため、MySQLデータベースにアクセスする独自の実装を提供する必要があります。@Seanが提供したリンクに加えて、これで少し近づくことができれば幸いです。

于 2012-11-27T23:11:53.597 に答える
3

そのままでは、sass はローカル ファイルのみをインポートします (それ以外はすべて CSS の @import ステートメントにコンパイルされます) が、sass ドキュメントで説明されているように、 Sass::Importers::Baseクラスを拡張することで独自のカスタム インポーターを作成できます。

別の質問に対するこの回答は、カスタム HTTP インポーターの例を示しています。(少なくとも) 2 つの方法でこれにアプローチできます。データベース用のカスタム インポーターを作成するか、データベースから HTTP 経由で sass ファイルを提供します (単純な PHP ページなどを介して)。

于 2012-11-26T05:51:04.410 に答える