如何在没有生成器的Gem for Rails 3.1中打包CSS / JS文件?

时间:2011-07-17 19:34:15

标签: ruby-on-rails gem ruby-on-rails-3.1

我想编写一个gem,一旦绑定到Rails 3.1 Gemfile,就会包含一些样板CSS和JS文件。

我知道生成器,但是如果没有它们我怎么能这样做,这样可以添加和删除gem的效果,而不需要在Rails Gemfile中编辑一行?

理想情况下,我希望gem在安装时包含其默认的CSS / JS,然后让用户使用生成器生成CSS / JS文件,如果他们想要进行任何修改。


这是我从jquery-rails复制的示例gem,其中包含没有生成器的javascript文件。

css_gem/
  lib/
    css_gem.rb       {1}
    css_gem/
      engine.rb      {2}
  app/
    assets/
      stylesheets/
        css_gem/
          index.css  {3}
          base.css   {4}

{1} lib / css_gem.rb

module CssGem
  require "css_gem/engine"
end

{2} lib / css_gem / engine.rb

module CSSGem
  class Engine < Rails::Engine
  end
end

{3} app / assets / stylesheets / css_gem / index.css

/*
 *= require base
 */

{4} app / assets / stylesheets / css_gem / base.css

.custom { color: red; }

Rails Gemfile

gem 'css_gem', :path => 'path_to_my_local_gem'

这对我不起作用,Rails没有看到CSS文件。我做错了什么?


解决方案:谢天谢地,我找到了一个视频来抓住我的手:http://house9.blogspot.com/2011/06/rails-31-asset-gem.html

我还必须手动将*= require css_gem添加到我的Rails样式表清单(app / assets / stylesheets / application.css)。咄。

4 个答案:

答案 0 :(得分:7)

Zurb有一篇很棒的文章介绍了他们如何将基础资产打包为gem:

"Yetify Your Rails: New Foundation Gem and How To Gemify Your Own Assets"

答案 1 :(得分:3)

答案 2 :(得分:2)

免责声明 - 我还没有尝试过这个。您可以利用Rails 3.1中的Asset Pipeline,在不使用生成器的情况下,将您宝石中的资产提供给客户端应用程序。

尚未找到使用中的实际示例,但这里是早期文档的链接

http://edgeguides.rubyonrails.org/asset_pipeline.html http://edgeguides.rubyonrails.org/asset_pipeline.html#adding-assets-to-your-gems

答案 3 :(得分:1)

对于那些寻找直接答案的人

如果您的宝石中有这些资产:

app  
|__ assets  
   |__ javascripts
   |  |__ foo
   |     |__ foo.js
   |
   |__ stylesheets
      |__ foo
         |__ foo.css

如果您创建一个生成器(在您的gem中),资源将自动包含在内:

# lib/generators/foo/install/install_generator.rb

module Foo
  module Generators
    class InstallGenerator < Rails::Generators::Base

      def add_javascripts
        append_file 'app/assets/javascripts/application.js', "//= require foo/foo\n"
      end

      def add_stylesheets
        inject_into_file 'app/assets/stylesheets/application.css', " *= require foo/foo\n", :before => /\*\//, :verbose => true
      end
    end
  end
end