从数据库而不是文件系统导入SASS文件

nik*_*hil 5 ruby sass compass-sass

我对Ruby没有多少经验.我想从数据库而不是文件系统@import sass.我没有在网上找到任何例子.我该怎么做呢?我看到我必须扩展一个导入器类,但由于我不了解ruby,我需要知道我的文件系统中该类所在的位置(只是检查它)以及一般涉及的基本步骤是什么.

更多信息

MySQL数据库包含sass内容.因此,在我的Web应用程序中,我接受来自用户的sass(作为字符串),其中可能包含import语句,例如:

@import test.scss
body  { color:red } 
Run Code Online (Sandbox Code Playgroud)

现在在我的MySQL DB中,我会有类似的东西

Table  sass_files
column_name             filename  |   content
example row             test.scss |   p {color:blue;}
Run Code Online (Sandbox Code Playgroud)

我想让这个导入工作,确保我可以只是进行正则表达式匹配从用户输入获取文件名,然后通过该文件名查询数据库并获取内容.但我读到有一种很好的方法可以让ruby/sass使用DB作为加载路径而不是文件系统.

UPDATE

所以我用find方法创建了一个虚拟自定义导入器类

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

如何使用ruby将此导入程序添加到sass加载路径中,就像我可以更改sass gem文件夹中的源文件并将此导入程序添加到lib/sass/importers中?

谢谢

hop*_*per 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()
Run Code Online (Sandbox Code Playgroud)

然后在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
Run Code Online (Sandbox Code Playgroud)

然后在您的 Sass 文件中您可以使用导入器:

require File.join(File.dirname(__FILE__), 'importer.rb')
Sass.load_paths << Sass::Importers::Custom.new()
Run Code Online (Sandbox Code Playgroud)

当然,这只是一个仅接受 URI 匹配的虚拟实现"[globals]"。您需要提供自己的实现来访问 MySQL 数据库,因为我没有任何 Ruby 数据库访问经验。不过,除了 @Sean 提供的链接之外,希望这能让您更接近一些。