从数据库而不是文件系统导入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页面或其他内容)