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

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

更多信息

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

@import test.scss body { color:red } 

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

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

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

UPDATE

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

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

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

谢谢

由于您使用Compass进行编译,因此可以在Compass配置文件中添加自定义Sass导入程序。 例如,使用compass compile -c config.rb进行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; } 

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

开箱即用,sass只会导入本地文件(其他任何东西都被编译成CSS @import语句)但是正如sass文档解释的那样,你可以通过扩展Sass :: Importers :: Base类来编写自己的自定义导入器。

对另一个问题的回答给出了自定义HTTP导入器的示例。 您可以(至少)以两种方式处理此问题:为数据库编写自定义导入程序或通过HTTP从数据库提供sass文件(通过简单的PHP页面或其他内容)