我对Ruby没有多少经验。我想从数据库而不是文件系统@import sass。我没有在网上找到任何例子。我该怎么做呢?我看到我必须扩展一个导入器类,但由于我不了解ruby,我需要知道我的文件系统中该类所在的位置(只是检查它)以及一般涉及的基本步骤。
更多信息
MySQL数据库包含sass内容。 因此,在我的Web应用程序中,我接受来自用户的sass(作为字符串),其中可能包含import语句,例如:
@import test.scss
body { color:red }
现在在我的MySQL数据库中,我会有类似的东西
Table sass_files
column_name filename | content
example row test.scss | p {color:blue;}
我想让这个导入工作,确保我可以只进行正则表达式匹配以从用户输入获取文件名,然后通过该文件名查询数据库并获取内容。 但我读到有一种很好的方法可以让ruby / sass使用DB作为加载路径而不是文件系统。
更新
我创建了一个虚拟自定义导入器类,其find方法为
def find(name, options)
Sass::Engine.new("p { color :blue; }", options)
end
如何使用ruby将此导入程序添加到sass加载路径中,就像我可以更改sass gem文件夹中的源文件并将此导入程序添加到lib / sass / importers一样?
谢谢
答案 0 :(得分:3)
开箱即用,sass只会导入本地文件(其他任何东西都被编译成CSS @import语句),但是as the sass docs explain你可以通过扩展Sass::Importers::Base类来编写自己的自定义导入器。 / p> 另一个问题的
This answer给出了自定义HTTP导入程序的示例。您可以(至少)以两种方式处理此问题:为数据库编写自定义导入程序或通过HTTP从数据库提供sass文件(通过简单的PHP页面或其他方式)
答案 1 :(得分: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;
}
当然,这只是一个虚拟实现,只接受匹配"[globals]"
的URI。您需要提供访问MySQL数据库的自己的实现,因为我没有任何Ruby数据库访问经验。希望除了@Sean提供的链接之外,这应该让你更近一些。