2012-12-19 107 views
6

所以我看到很多關於在CSS文件中使用erb的討論。通過使用<%=%>語法並向文件中添加.erb,我可以讓ERB處理CSS文件,但我真正需要的是訪問控制器中的實例變量。在CSS中訪問Rails控制器實例變量

searches_controller.rb

def new 
    @search = Search.new 
    @school = School.find(params[:school]) 
end 

我真的很想做的是:

searches.css.scss.erb

h1.logo { 
    color: <%= @school.primary_color %>; 
} 

但該局將拋出錯誤,因爲@學校是零。有什麼辦法可以要求控制器訪問這些實例變量嗎?

我能想到的唯一方法是將其作爲數據屬性嵌入到視圖中,然後使用JS在前端進行更改。這讓我覺得可能更好,因爲CSS文件不會改變,每次都需要重新發送,但是它也不會很優雅。

回答

9

您還需要考慮在預編譯的資產場景中,CSS將在編譯期間通過Sprockets運行,所以最終會產生靜態顏色(假設@school實際上是實例化的,它不會是)。這是不可取的,因爲每個學校都會有相同的顏色(無論在編輯階段發生了什麼)。

自定義品牌是這樣,我們讓我們的用戶可以指定自己的顏色,包括CSS的佈局塊:

:css 
    h1.logo { 
     color: <%= @school.primary_color %>; 
    } 

這是不理想的,但如果你有客戶化的少數似乎工作得很好。

+0

謝謝。我希望在意見之外處理它,但似乎這是一條路。 – rurabe

+0

你能否提供更多關於添加css塊到佈局的細節......?我想根據屏幕大小交換圖像,並且需要一種方法讓我的媒體查詢查看我的實例變量。 – brntsllvn

2

我寧可在您看來使用@school.primary_color。這應該工作:

<h1 style="color:#{@school.primary_color}">@school.name</h1> 

只要記住使用雙引號插入。

+0

我儘可能早地照顧零。所以在這種情況下,視圖永遠不會被賦予一個'nil'對象。但是,如果這是一個問題,那麼整個觀點應該真的被包裝在一個條件。這不僅僅是這種用法。 – mehulkar

+0

唯一的問題是,如果你必須在多個視圖中的多個位置使用該顏色,最終會得到一些不可維護的代碼。 –

+0

這是一個很好的觀點。根據學校數量的不同,在每個學校的CSS文件中定義常量,而不是在數據庫中定義常量也許是個好主意。 – mehulkar

相關問題