【问题标题】:How do I load extensions to the Sass::Script::Functions module?如何将扩展加载到 Sass::Script::Functions 模块?
【发布时间】:2012-01-31 04:48:25
【问题描述】:

我正在尝试根据以下建议扩展 Sass:Script::Functions 模块:https://gist.github.com/481261/dd07a52829886ab1ad0875a8895f0100c4b925ab。问题是,我应该在哪里放置 sass-hex.rb 文件,我是否必须做任何事情来“加载”模块扩展?我尝试将文件放在 config/ 中,但似乎没有加载。当我进入 Rails 控制台并输入 Sass::Script::Functions::hex 时,我得到:“NoMethodError: undefined method `hex' for Sass::Script::Functions:Module”。

我是 Rails 新手,所以答案可能非常明显和微不足道。也许这就是为什么所有讨论扩展 Sass::Script::Functions 的网站都没有提到如何将扩展实际连接到代码中的原因。这是官方文档,但在这方面也没有帮助:http://sass-lang.com/docs/yardoc/Sass/Script/Functions.html#adding_custom_functions

更新:

所以,我将方法的定义从“def hex ...”更改为“def self.hex ...”,现在 Sass::Script::Functions.hex 可以工作了。我仍然觉得我错过了一些东西,就像没有人建议的那样“自我”。需要...还是我在上面的示例中错误地调用了该方法?

另外,问题是“hex”方法根本没有从我使用它的 CSS 文件中调用。

最后更新:

解决方案是实际执行我最初所做的:将代码放在 config/ 目录中(在我的例子中,在 compass.rb 文件中)。

我被卡住并认为它对我不起作用的原因有两个:

  • Sass::Script::Functions::hex 无法从控制台调用...不知道为什么,但我错误地假设如果我正确安装了东西,我将能够以这种方式对其进行测试.
  • 由于我来回尝试了一堆东西,我可能从来没有正确的组合在 config/compass.rb 文件中使用 hex 函数,从 .css 文件中调用它,并重新启动 rails 服务器.

真是浪费时间 - 我希望这可以帮助其他人避免它......

【问题讨论】:

    标签: ruby-on-rails sass compass-sass


    【解决方案1】:

    我通常在 lib 中创建一个名为“sass”的文件夹,并在该文件夹中创建一个 sass-hex.rb(确保此文件夹位于加载路径上)

    module Sass::Script::Functions
      module SassHex
        def hex(decimal)
          Sass::Script::String.new("%02x" % decimal)
        end
      end
      include SassHex
    end
    

    你应该要做的就是需要 sass-hex.rb 文件,我在扩展 sass 时在 compass 中经常使用这个技巧。

    【讨论】:

    • 斯科特,感谢您的回答。我认为我缺少的是一些对你来说很明显的东西:a)我如何“确保文件夹在加载路径中”? b) 我在哪个文件中“需要 sass-hex.rb”?
    • 嗨,斯科特,您通常在哪里需要您的 .rb 文件?这有点奇怪,因为我们应该将它包含在 ruby​​ 中并在 sass 中调用函数......你是怎么做到的?
    • 这让我为我最终需要通过 Ruby 实现修复的问题指明了正确的方向,谢谢!
    【解决方案2】:

    我刚刚解决了这个问题,以便能够使用 Compass 的 compact 函数。这是整个独家新闻:

    lib/sass.rb(创建一个新文件)

    # Compact function pulled from compass
    module Sass::Script::Functions
    
      module CustomSassExtensions
        def compact(*args)
          sep = :comma
          if args.size == 1 && args.first.is_a?(Sass::Script::List)
            args = args.first.value
            sep = args.first.separator
          end
          Sass::Script::List.new(args.reject{|a| !a.to_bool}, sep)
        end
      end
    
      include CustomSassExtensions
    
    end
    

    config/application.rb(将其放在class Application 内,紧跟config.autoload_paths 行之后)

    if config.respond_to?(:sass)
      require "#{config.root}/lib/sass.rb"
    end
    

    让我知道它是否对你有用。

    【讨论】:

    • 您好,感谢您的回答!这看起来可以工作,但我以不同的方式解决了我的问题。请参阅上面的最新更新。
    猜你喜欢
    • 2020-04-25
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 2016-06-22
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多