2012-01-31 72 views
2

僅使用相關資產我對Rails有點新,目前爲止還不錯。資產管道/鏈輪相當整齊,但我有點困惑。當爲我的各種控制器生成腳手架時,將單個的css/SCSS文件放入app/assets/stylesheets。但對於我的項目,我使用LESS而不是SCSS,因此我用.css.less文件替換了它們。僅使用Rails 3.2 + Sprockets + LESS

我遇到的問題是,如果我將CSS添加到控制器(例如,讓我們稱之爲「home.css.less」),它會包含在每個視圖中,而不僅僅是屬於「home 「控制器。如果我刪除「* = require_tree」。從application.css文件中,然後該文件不包含在任何視圖中。

如何使用Rails資產管道爲特定控制器/視圖指定CSS代碼?

application.css:

/* 
    *= require twitter/bootstrap 
    *= require_self 
    *= require "application_custom" 
*/ 

home.css.less:

body { 
    background: asset-url("circles.png") no-repeat; 
} 

在沒有背景上述結果被應用,甚至給家庭控制器的看法。

回答

3

這是一個相當普遍的要求;許多網站都有主頁特定的CSS,他們不希望在整個網站上應用。

如果可能,我會在提供解決方案之前就此提出幾點意見。

管道向客戶端呈現一個CSS(和一個JS)文件的目的。添加摘要以允許添加服務器標頭,強制遠程客戶端將它們的副本保留在其本地緩存中。

由於性能原因,單個請求和主動緩存策略是Rails的默認值;每個請求都會減慢頁面的速度。

除非主頁CSS真的很廣泛,否則我會推薦使用默認行爲。如果想要分離出來的是來自家庭和其他頁面之間的CSS選擇器的衝突,我建議改變CSS結構來解決這個問題。

至少有兩個共同的解決方案:

第一個將被使用,如果要手動一個不同的文件每個控制器。

<%= stylesheet_link_tag "application", controller_name %> 

對於這種在生產中,你必須告訴Rails預編譯所有單個CSS文件(application.rb中)工作:

config.assets.precompile << '*.css' 

二是要增加一個助手來僅呈現CSS當從視圖中需要時。

我推薦this question的頂級解決方案。你將不得不修改CSS的助手名稱。只有當它在視圖中設置時,它纔會爲所需的CSS生成一個標記。

+0

如何從application.css中移除'require_tree .',然後在主佈局中添加一個'<%= stylesheet_link_tag @current_controller%>'?這樣主應用程序的緩存被保留。我只是試了一下,它似乎工作。 – 2012-01-31 19:51:03

+0

是的,我認爲require_tree會被刪除。 – 2012-01-31 20:00:02