在Rails的资产管线动态CSS,编译飞(Dynamic CSS in Rails asset pi

2019-08-04 01:41发布

我用Rails 3.2建立一个网站。 它是3年,因为我已经感动的Rails或者Ruby,所以我在两个生锈,再加上我废钢轨的最后时间是Rails的2.3。 不用说,下面请原谅任何“简单”的问题。

这里是规格

  • 多坦CMS /存储站点
    • http://company1.mywebsite.com
    • http://company2.mywebsite.com
    • 等等
  • 每个“商店”(又名子域)可以有自己的外观,手感等,通过自定义CSS
    • 自定义可在该应用允许用户内的UI来执行改变(即自举的基本变量@textColor@bodyBackground等)
  • 我使用的less-rails-bootstrap宝石到Twitter的引导外观/感受等。

这里是挑战

  1. 我需要能够动态输出变量的CSS到一个文件,该文件被混合来引导这样的变量捡起来创建最终的CSS
  2. 当用户改变一个变量的CSS,现有的风格基本上是无效的。 我需要完整的CSS编译和写回到磁盘,内存流,或一些其他地方,我可以得到我的手就可以了(记得这是使用less
  3. 我需要不同的CSS每个子域吐了出来。 任何建议如何处理呢?

这个问题进一步复杂化?

......因为我基本上将不得不寻找一些方法来编制上飞的CSS,这意味着我必须包括GEMS我通常不会在生产环境中。 表现将是非常重要的。 有没有一种方法来隔离? 一旦CSS已经无效和再生,我可以采取的内容,要么将其写入到磁盘上或存储在一些分布式缓存/ Redis的/等。 实例的性能。

任何意见,哪怕只是点我的大方向,将不胜感激。

谢谢!

Answer 1:

这里是我终于登上了解决方案:

  • 我最终切换到bootstrap-sass代替https://github.com/thomas-mcdonald/bootstrap-sass
  • 做了以下修改我的application.rb的文件,以确保:asset组总是包含尽管环境:

     if defined?(Bundler) # If you precompile assets before deploying to production, use this line # Bundler.require(*Rails.groups(:assets => %w(development test))) # If you want your assets lazily compiled in production, use this line Bundler.require(:default, :assets, Rails.env) end 
  • 使用曼努埃尔Meure提供的概念(谢谢曼努埃尔!)的克劳特计算发现,在http://www.krautcomputing.com/blog/2012/03/27/how-to-compile-custom-sass-stylesheets-dynamically-期间运行时/ 。

    • 我做了一些调整,以满足自己的需要,但曼努埃尔所示的核心概念是我的编译过程的基础。
  • 在我的模型(可以称之为“ 网站 ”),我的代码看起来像这样一个片段:

     # .../app/models/site.rb ... BASE_STYLE = " @import \"compass/css3\"; <ADDITIONAL_STYLES> @import \"bootstrap\"; @import \"bootstrap-responsive\"; ".freeze # Provides the SASS/CSS content that would # be included into your base SASS content before compilation def sass_content " $bodyBackground: #{self.body_background}; $textColor: #{self.text_color}; " + self.css # Any additional CSS/SASS you would want to add end def compile_css(test_only = false, force_recompile = false) # SassCompiler is a modification of the information made available at the Kraut Computing link compiler = SassCompiler.new("#{self.id}/site.css", {:syntax => :scss, :output_dir => Rails.root.join('app', 'assets', 'sites')}) # Bail if we're already compiled and we're not forcing recompile return if compiler.compiled? && !force_recompile && !test_only # The block here yields the content that will be rendered compiler.compile(test_only) { # take our base styles, slap in there some vars that we make available to be customized by the user # and then finally add in our css/scss that the user updated... concat those and use it as # our raw sass to compile BASE_STYLE.gsub(/<ADDITIONAL_STYLES>/, self.sass_content) } end 

我希望这有帮助。 我知道它从原来的职位有偏差,但其偏离的,因为这似乎是最能达到解决问题的办法。

如果我还没有回答你有一个具体的问题,请随时发表评论,所以我可以扩大在可能的情况。

谢谢!



文章来源: Dynamic CSS in Rails asset pipeline, compile on fly