3

在一個Rails 3.1應用程序中,一個控制器需要使用一組自定義變量對每個請求所需的所有Sass樣式表進行編譯。理想情況下,編譯必須通過資產管道進行,以便生成基於內容的資產名稱(包含內容的MD5哈希值)。對於解決方案來說,使用純Sass功能非常重要,而不是訴諸於Sass樣式表的ERB處理。在Rails 3.1下編譯每個請求的自定義變量Sass

從研究我在這裏和其他地方做了,下面似乎是一個可行的方法:

  1. 設置變量訪問

    • 創建使用自定義的某種類型的變量訪問橋Sass功能,例如,如Konstantin Haaseheregist)所述。這似乎很容易做到。

    • 通過Sass部分配置所有變量訪問,例如在Compass方式的_base.sass中。部分可以使用上面定義的自定義函數。也很容易。

  2. 捕捉所有資產的引用

    • 裝飾視圖對象的asset_path方法。我有這個工作很好。

    • 使用Sprockets::Environment的自定義子類來解析引用。這也很好。

  3. 部隊資產重新編譯,無論文件修改的時間

    • 我還沒有找到一個很好的解決方案呢。

    • 我見過通過實例化新的Sass::Engine並傳遞將在Sass::Script::Functions::EvaluationContext中可用的自定義數據來手動啓動Sass處理的示例。這種方法的問題是我必須自己管理文件命名和路徑,而且我總是冒着可能偏離什麼Sprockets的風險。

    • 我無法找到強制處理每個請求的任何示例,無論文件模式時間,也允許自定義變量傳遞。

我會很感激上的一般做法意見以及任何具體指示/建議如何以最佳方式處理(3)。

回答

1

Sim。

這是可能的。看看SASS: Set variable at compile time

我寫了一個解決方案來解決它,我會很快發佈並推送到這裏,以防您或其他人仍然需要它。

+0

太棒了,我很期待! – Sim

1

SASS被設計爲預編譯爲CSS。讓Sprockets對每個請求的視圖請求都不會很好。每個請求都需要等待編譯完成,並且不會很快(從服務頁面的角度來看)。

MD5代是在Sprockets中,所以如果你改變自定義變量,你將不得不在每一個請求上強制編譯,以確保看到的變化,因爲視圖是(可能)不知道。

聽起來好像這不是資產管道的甜蜜點,你應該看看爲真正動態的CSS做更多優化。

對不起。 :-)

+1

Richard,你的答案假定有問題的Rails應用程序會遇到高負載。它不會。實際上,它提供了一個低負載的後端服務。其目的是基於請求參數的輕微變化動態生成(編譯,確實)資產版本,並因此需要在每次請求時重新運行資產管道。 – Sim