Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails资源管道中的动态CSS,动态编译_Ruby On Rails_Ruby_Ruby On Rails 3.2_Less_Asset Pipeline - Fatal编程技术网

Ruby on rails Rails资源管道中的动态CSS,动态编译

Ruby on rails Rails资源管道中的动态CSS,动态编译,ruby-on-rails,ruby,ruby-on-rails-3.2,less,asset-pipeline,Ruby On Rails,Ruby,Ruby On Rails 3.2,Less,Asset Pipeline,我正在Rails 3.2中构建一个站点。我已经三年没有接触过Rails或Ruby了,所以我对这两个都很生疏,加上我最后一次使用Rails是Rails2.3。不用说,请原谅下面的任何“简单”问题 这是规格 多坦能CMS/商店站点 等等 每个“商店”(又名子域)都可以通过CSS定制拥有自己的外观、感觉等 可以在应用程序内的UI中执行自定义,允许用户更改引导的基本变量(即@textColor,@bodyBackground等) 我正在使用lessrails引导程序gem来实现Twitte

我正在Rails 3.2中构建一个站点。我已经三年没有接触过Rails或Ruby了,所以我对这两个都很生疏,加上我最后一次使用Rails是Rails2.3。不用说,请原谅下面的任何“简单”问题

这是规格
  • 多坦能CMS/商店站点
    • 等等
  • 每个“商店”(又名子域)都可以通过CSS定制拥有自己的外观、感觉等
    • 可以在应用程序内的UI中执行自定义,允许用户更改引导的基本变量(即
      @textColor
      @bodyBackground
      等)
  • 我正在使用
    lessrails引导程序
    gem来实现Twitter引导程序的外观/感觉,等等
以下是挑战
  • 我需要能够动态地将CSS的变量输出到一个文件中,该文件将混合到引导中,以便提取变量来创建最终的CSS
  • 当用户更改CSS的变量时,现有样式基本上无效。我需要重新编译完整的CSS,并将其写回磁盘、内存流或其他我可以使用它的位置(记住这是使用
    less
  • 我需要不同的CSS吐出每个子域。关于如何处理这个问题有什么建议吗
  • 使事情进一步复杂化。。。 …考虑到我基本上必须找到某种方法来动态编译CSS,这意味着我必须包含通常不会在生产环境中使用的gem。表现将非常重要。有没有办法将其隔离?一旦CSS失效并重新生成,我可以获取内容并将其写入磁盘或存储在某个memcached/redis/等实例中以提高性能

    任何意见,即使只是给我指出一个大致的方向,都将不胜感激


    谢谢

    以下是我最终找到的解决方案:

    • 我最终切换到
      引导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
      
    • 使用了德国克劳特计算公司的曼努埃尔·缪尔(Manuel Meure)(谢谢曼努埃尔!)提供的概念

        我做了一些调整,以适应我自己的需要,但曼努埃尔的核心概念是我编译过程的基础。
    • 在我的模型(我们称之为“站点””)中,我有一段代码,如下所示:

      # .../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
      
      #…/app/models/site.rb
      ...
      基本样式=”
      @导入“指南针/css3”;
      @导入“引导”;
      @导入“引导响应”;
      “.别动
      #提供将
      #在编译之前,请将其包含在基本SASS内容中
      def sass_内容
      "
      $bodyBackground:#{self.body_background};
      $textColor:#{self.text_color};
      “+self.css#您想添加的任何其他css/SASS
      结束
      def compile_css(仅测试=false,强制重新编译=false)
      #SassCompiler是对Kraut计算链接提供的信息的修改
      compiler=SassCompiler.new(“#{self.id}/site.css”,{:syntax=>:scss,:output_dir=>Rails.root.join('app','assets','sites'))
      #如果我们已经编译了,并且没有强制重新编译,就可以保释
      返回compiler.compiled?&&!强制重新编译&!仅测试
      #这里的块产生将被呈现的内容
      compiler.compile(仅限测试){
      #以我们的基本样式为例,添加一些我们提供的变量,供用户自定义
      #然后最后添加我们的css/SCS,用户更新了这些内容,并将其用作
      #我们的原始sass需要编译
      BASE_STYLE.gsub(/,self.sass_内容)
      }
      结束
      
    我希望这有帮助。我知道这与原来的帖子有偏差,但这是有偏差的,因为这似乎是解决这个问题最可行的办法

    如果我还没有回答你的一个具体问题,请随时发表评论,以便我可以尽可能地展开讨论


    谢谢

    您可以添加像
    这样的规则!重要信息
    在动态添加的脚本中,用于更改内容。那么你就不必做所有这些重新编译了。这里的部分目标是能够利用CSS中变量的优势。这些变量在引导源文件中得到重用。例如变量
    @purple
    。这允许用户指定我们要使用的“紫色”的颜色(色调/饱和度等)。然后在引导过程中的多个位置使用。很遗憾,常规CSS在这里不起作用。Ryan,我正在寻找与您相同的答案,因为我想利用引导变量。当然,它在开发中起作用,因为事情是动态编译的。我正在做一些类似的事情,将客户的较少文件保存在lib/assets/stylesheets/customers中。然后在我的application.html.erb文件中,我检查站点是否通过子域访问,然后提供相应的文件(我在子域后命名.less文件)。你搞清楚了吗?如果没有,我会在你的问题上添加我自己的观点,这样我就不会重复了。我很好奇你是否知道我如何将此部署到Heroku,因为他们坚持所有部署都必须是
    initialize\u on\u precompile=false
    @Trip,希望我能为你提供一个好的答案。这是一个有点,因为我一直在Rails的土地,不能回忆起如果我遇到了这件事-对不起。如果您觉得可以在此基础上进行扩展,请随意编辑我的答案。啊,我确实找到了一个答案,可以将其设置为true进行部署,您只需使用Heroku的默认构建包。。从技术上讲,默认情况下应该运行。我的错误是两年前,同一个应用程序有一个定制的,一些开发者正在修补它,而我没有更新它