【问题标题】:How to create a gem that serves static assets to Rails 3 & Rails 4 projects如何创建一个为 Rails 3 和 Rails 4 项目提供静态资产的 gem
【发布时间】:2014-08-15 09:41:02
【问题描述】:

我们一直在尝试制作一个 gem,将我们的 CSS 文件提供给我们的 Rails 3 和 Rails 4 项目。使用 gem,我们应该能够只在一个地方进行更改,即 gem,为我们所有的项目做出视觉上的改变。

除了,我们发现的所有教程都不再是最新的或不起作用。使用来自 Rake Routes 的教程,我们遇到了以下情况来创建一个 minimal gem,它将 CSS 文件添加到 Rails 3 和 Rails 4 项目

宝石规格

$:.push File.expand_path("../lib", __FILE__)
require "static_assets/version"

Gem::Specification.new do |s|
  s.name        = "static_assets"
  s.version     = StaticAssets::VERSION
  s.authors     = ["Etienne van Delden"]
  s.email       = ["evdelden@i-level.nl"]
  s.homepage    = "http://www.i-level.nl"
  s.summary     = "Summary of StaticAssets."
  s.description = "Description of StaticAssets."

  s.files       = `git ls-files`.split("\n")
  s.test_files  = `git ls-files -- {test,spec,features}/*`.split("\n")

  s.add_dependency "rails", ">= 3.1"
  s.require_paths = ["lib"]

  s.add_development_dependency "sqlite3"
end

lib/static_assets.rb

require "static_assets/engine"

module StaticAssets
end

lib/static_assets/engine.rb

module StaticAssets
  class Engine < ::Rails::Engine
    initializer 'static_assets.load_static_assets' do |app|
      app.middleware.use ::ActionDispatch::Static, "#{root}/vendor"
    end
  end
end

vendor/assets/stylesheets/our_awesome_static_assets.css

body{
  background-color: red !important;
}

这似乎是创建 gem 的最少代码。 rake builds 成功了,rake release 也成功了

但是当将 gem 添加到我们的 Rails 3 项目时,它找不到 CSS 文件:

宝石文件

gem 'static_assets'

application.css

*= require static_assets

当启动项目并进入索引页面时,我们得到以下错误:

 Sprockets::FileNotFound in Sessions#new

Showing *snipped*/app/views/layouts/application.html.erb where line #14 raised:

couldn't find file 'static_assets'
  (in *snipped*/app/assets/stylesheets/application.css:4)

我们需要进行哪些更改才能获得将样式表添加到支持 Rails 3 和 Rails 4 的 Rails 项目的最小代码示例?

代码可以在Github找到

【问题讨论】:

    标签: css ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 gem


    【解决方案1】:

    几个月前我写了一个 gem - exception_handler

    Our gem uses custom assets(不是 CSS,只有图片)我可以在这里详细说明:

    --

    引擎

    当您为 Rails 编写 gem 时,you're really writing an engine 可以包含在您的 Rails 应用程序中。

    对此最基本的解释是,当您加载 gem 时,它实际上会将“隐藏”文件和功能附加到您的应用程序中。不是魔法或巫术——实际上只是将新文件添加到应用程序的运行时环境中,允许您调用该功能,就像您自己编写一样。

    当我明白这一点后,gem 的创建过程就变得简单多了……

    --

    资产

    我认为您最好将资产放入以下文件结构中:

    app
    |-- assets
    |    |-- stylesheets
    |    |   |-- static_assets
    |    |   |   |-- static_assets.css
    

    这将使您的引擎能够使用/创建您需要的文件,让您可以让它们代表您工作。与许多其他基于 Rails 的 gem 一样,Rails 环境将根据其可用的文件加载资产管道。

    正如我所提到的 - 一个引擎真的 在运行时将文件“注入”到您的应用程序中。这意味着,与其他 gem 一样,例如 twitter-bootstrap-rails gem,您必须调用这些注入文件,如下所示:

    #app/assets/stylesheets/application.css
    /*
      *= require static_assets/static_assets
    */
    

    这应该对你有用 - 如果没有,我们将不得不在 cmets 中进行调查!

    【讨论】:

    • 谢谢!通过您建议的更改,gem 现在可以在我们的 Rails 4 项目中运行!我现在唯一的问题是它在我们的 Rails 3 项目中不起作用。是否有可能制作一个 gem 来支持两个版本的 rails?
    猜你喜欢
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 2014-08-26
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    相关资源
    最近更新 更多