创建rails插件以预处理资产

时间:2014-12-22 01:27:49

标签: ruby-on-rails ruby sprockets

我创建了一个小型CSS预处理器,它有点类似于SASS,现在我想在现实生活中测试它。方案,所以我试图为它创建一个rails插件,就像sass-rails的工作方式一样。

我试过这个,却不确定我在做什么:

require 'toss-ruby'
require 'sprockets'

module Toss
  module Rails
    class Template < ::Tilt::Template
      def prepare

      end

      def evaluate(scope, locals, &block)
        g = ::Toss::Generator.new

        g.parse_string data
        g.generate_string
      end
    end
  end
end

Sprockets.register_engine '.toss', ::Toss::Rails::Template

根据文档,最后一行应该注册我的模板,所以链轮可以使用它,但它不会发生,所以我认为它从未被调用过。像thinsass-rails等一些宝石如何只能通过放入Gemfile来工作?何时以及如何调用他们的代码?

1 个答案:

答案 0 :(得分:1)

有一种约定可以在Gemfile中包含的gem中执行代码。

如果gem的代码库的lib目录中存在一个文件,其名称与gem相同并且扩展名为.rb,则默认情况下Bundler加载gem时需要该文件。

以一个名为“Mygem”的宝石为例。这是gem的典型目录结构:

mygem/   (gem's root directory)
|-- lib/
|   |-- mygem.rb  <-- automatically required!
|   `-- mygem/
|       |-- base.rb
|       `-- version.rb
|-- test/
|-- bin/
|-- Rakefile
`-- mygem.gemspec

当Bundler加载'mygem'宝石时,它会自动需要lib/mygem.rb。 Rails插件和引擎依赖此行为来加载其代码。通常,他们使用此文件来要求lib目录中的其他文件。在这种情况下,lib/mygem.rb文件可能需要lib/mygem/base.rb文件等

在开发gem时,通常使用Bundler:path指令将其添加到Gemfile中,该指令告诉Bundler在本地文件系统的某个路径上查找gem,而不是在rubygems上查找。假设您正在测试应用程序的vendor / engines目录下构建gem。

您的测试应用的Gemfile:

gem 'rails'
gem 'mygem', path: './vendor/engines/mygem'

启动Rails应用程序时,其中一个步骤是load it's gems。当加载'mygem'gem时,Bundler需要'./vendor/engines/mygem/lib/mygem.rb'来执行其中的代码。您放入的任何代码都将在Rails初始化之前运行。

如果您的代码需要作为应用程序初始化的一部分运行,则需要遵循guide for creating Rails plugins/engines。通常,您将从:: Rails :: Engine继承您的插件并在其中调用initializer并传递包含初始化代码的块。

考虑到所有这些,请再次查看sass-rails gem的源代码,特别是在加载gem时需要的lib/sass-rails.rb以及它递归需要lib/sass/rails/railtie.rb的方法,插件与Rails集成的必要设置和初始化。