【问题标题】:Import SASS file from database instead of filesystem从数据库而不是文件系统导入 SASS 文件
【发布时间】:2012-11-13 13:45:44
【问题描述】:

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

更多信息

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

@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 吗?

谢谢

【问题讨论】:

  • 您使用的是哪个数据库?它是什么样的文件?我不确定这个问题是否清楚。考虑添加更多细节、示例和伪代码,以更好地阐明您的要求。

标签: ruby sass compass-sass


【解决方案1】:

由于您使用 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 提供的链接之外,希望这能让您更接近一点。

【讨论】:

  • 太完美了!!这就是我需要的。谢谢。
【解决方案2】:

开箱即用,sass 只会导入本地文件(其他任何东西都编译成 CSS @import 语句),但 as the sass docs explain 您可以通过扩展 Sass::Importers::Base 类来编写自己的自定义导入器。

This answer 到另一个问题给出了一个自定义 HTTP 导入器的示例。你可以通过(至少)两种方式来解决这个问题:为你的数据库编写一个自定义导入器,或者通过 HTTP 从数据库中提供 sass 文件(通过一个简单的 PHP 页面或其他方式)

【讨论】:

  • 是的,我看到了,但是我应该把这些文件放在哪里(导入器文件),我是否需要在 sass 源文件中的某个位置添加要求或添加这些导入器文件?
  • 您将导入器文件放在任何有意义的地方,并将路径添加到load_paths option。你如何做到这一点取决于你的应用是如何配置的以及你如何使用 sass。
  • 我认为构建自己的导入器的整个概念是使其独立于您的应用程序。我只需要一个从 DB 导入的导入器,并且在线没有示例。由于我没有使用 Ruby 进行编程,因此我在入门时遇到了困难。
  • 它在某种程度上独立于您的应用程序,但您的应用程序依赖于 sass。应用程序如何使用 sass?编写导入器需要了解 Ruby。
  • 应用程序只是在应用程序根据用户输入的 sass 字符串创建的文件上运行“指南针编译”
猜你喜欢
  • 2011-10-15
  • 1970-01-01
  • 2012-05-08
  • 1970-01-01
  • 2011-11-10
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
  • 1970-01-01
相关资源
最近更新 更多