2012-12-13 45 views
8

我在Rails 3.2中構建了一個站點。自從我觸及Rails或Ruby之後已經有3年了,所以兩者都生鏽了,再加上我最後一次使用Rails是Rails 2.3。不用說,請原諒以下任何「簡單」問題。Rails資產管道中的動態CSS,實時編譯

這裏是規格

  • 多坦CMS /存儲站點
  • 每個 「商店」(又名子域名)可以通過CSS自定義0具有自己的外觀,感覺等
    • 定製可以在應用程序中的應用程序中執行,允許用戶更改Bootstrap的基本變量(即, @textColor@bodyBackground等)
  • 我使用less-rails-bootstrap寶石到Twitter的引導外觀/感受等

這裏是挑戰

  1. 我需要能夠動態地將CSS的變量輸出到一個文件中,該文件被混合到Bootstrap中,因此變量被拾取以創建最終的CSS
  2. 當用戶更改CS的變量S,現有的風格基本上是無效的。我需要完整的CSS重新編譯並寫回到磁盤,內存流或其他可以讓我掌握的地方(請記住這是使用less
  3. 我需要不同的CSS來爲每個子域吐出。有關如何解決這個問題的任何建議?

而且此事複雜...

...因爲我基本上將不得不尋找一些方法來編制上飛的CSS,這意味着我必須包括GEMS我通常不會在一個生產環境。性能將非常重要。有沒有辦法隔離這個?一旦CSS失效並重新生成,我可以將內容寫入磁盤或將其存儲在某些memcached/redis/etc中。性能實例。

任何意見,即使只是指向一個大方向我將不勝感激。

謝謝!

+0

您可以在動態添加的腳本中添加像'!important'這樣的規則,以處理那些發生變化的事物。那麼你不需要做所有這些重新編譯 – AJcodez

+0

這裏的目標部分是能夠利用CSS中變量的優勢。這些變量在Bootstrap源文件中被重用。一個例子是變量'@ purple'。這允許用戶指定我們想要使用的「紫色」的顏色(色調/飽和度等)。然後在Bootstrap中多處使用。不幸的是,常規CSS不能在這裏工作。 –

+0

瑞恩,我正在尋找同樣的答案,因爲我想利用Bootstrap變量。當然,它在開發中起作用,因爲事情是在飛行中編譯的。我正在做類似的事情,因爲我在lib/assets/stylesheets/customers中保存了我的客戶較少的文件。然後在我的application.html.erb文件中,我正在檢查該網站是否使用子域訪問,然後提供相應的文件(我在子域名後命名.less文件)。你有沒有得到這個想法?如果不是的話,我會在你的問題上增加一些我自己的觀點,所以我不會嘲笑它。 – AKWF

回答

3

這裏是解決方案,我終於登上:

  • 我最終切換到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 
    
  • 使用了由Man提供的概念Kraut Computing的uel Meure(謝謝Manuel!)發現於http://www.krautcomputing.com/blog/2012/03/27/how-to-compile-custom-sass-stylesheets-dynamically-during-runtime/

    • 我做了一些調整以適合自己的需要,但Manuel所闡述的核心概念是我編譯過程的基礎。
  • 在我的模型(可以稱之爲 「網站」),我有一個代碼片段看起來像這樣:

    # .../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 
    

我希望這有助於。我知道它偏離了原來的帖子,但它的偏差,因爲這似乎是解決問題的最可行的辦法。

如果我還沒有回答你有一個具體的問題,請隨時發表評論,所以我可以擴大在可能的情況。

謝謝!

+0

我很好奇,如果你知道一種方法讓我將它部署到Heroku,因爲他們堅持所有的部署必須是'initialize_on_precompile = false' – Trip

+0

@Trip,希望我對你有一個很好的答案。自從我進入Rails領域之後,它已經有點過了,並且無法回想我是否碰到過這個作品 - 對不起。如果你覺得你可以擴大這一點,請隨時編輯我的答案。 –

+1

啊,所以我找到了答案,並且可以將它設置爲true來進行部署,您只需使用Heroku的默認buildpack。默認情況下應在技術上運行哪個。我的錯誤是在兩年前,同一個應用程序有一個自定義的應用程序,一些開發人員正在修補 - 而且我沒有更新它。 – Trip