2011-01-18 34 views
18

我正在研究在Rails應用程序中處理動態CSS的問題。在應用內,個人用戶和/或用戶組可以擁有通過CSS完成的自定義外觀和感覺。不會有任何固定數量的「外觀和感覺」或css文件,這個數字將隨着用戶和組的增長以及用戶通過應用程序的管理界面定義的外觀和感覺而增加。在整個典型的過程中,成千上萬(不是數以萬計的)不同的css變體將被提供。該應用程序會將預建的css存儲在mongodb中,因此它不必爲每個請求都支付構建css的代價,問題更多的是如何提供此動態CSS內容的最佳方式。我見過其他問題,比如[使用erb或sass]的[this] [1],但其中一些答案的日期是幾年,所以我想確保Rails 3沒有更好的答案。在Rails應用程序中處理動態CSS的最佳方法

+0

代替存儲在MongoDB中的CSS,爲什麼不將其存儲在磁盤上的CSS文件在公共目錄中的文件名是綁定到用戶的ID?這樣,你可以正常地服務於CSS(通過頭部的鏈接標籤)並利用瀏覽器緩存。無論何時進行更改,您都可以清除緩存並將基於編輯時間的緩存添加到鏈接標記src。 – 2011-01-18 21:38:49

回答

38

您可以把你的CSS文件作爲資源,將它們存儲在數據庫中,並與page caching爲他們提供服務,讓你只需要擊中分貝一次當CSS被修改時。以後的所有請求都將由Web服務器直接從緩存中提供,而不會觸及您的應用或數據庫。

# stylesheet.rb 
class Stylesheet < ActiveRecord::Base 
    validates_presence_of :contents 
end 

# stylesheets_controller.rb 
class StylesheetsController < ApplicationController 
    caches_page :show # magic happens here 

    def show 
    @stylesheet = Stylesheet.find(params[:id]) 
    respond_to do |format| 
     format.html # regular ERB template 
     format.css { render :text => @stylesheet.contents, :content_type => "text/css" } 
    end 
    end 
    # the rest is your typical RESTful controller, 
    # just remember to expire the cache when the stylesheet changes 
end 

# routes.rb 
resources :stylesheets 

# layouts/application.html.erb 
… 
<link href="<%= stylesheet_path(@current_user.stylesheet) %>" rel="stylesheet" type="text/css" /> 
+0

我正在嘗試這種方法,但遇到問題。我在CSS中的body元素上有一個背景圖片,但是在請求css時沒有被請求。 – 2011-11-13 19:22:49

3

那麼,我已經與這個工作了幾次,但他們肯定沒有固定的CSS文件可供選擇。它應該或多或少相同。

我用過的很多東西之一是content_for塊。基本上

 
<% content_for :css do %> 
// some css file or css content 
<% end %> 

而且在佈局管理佈局

 
<%= yield :css %> 

非常簡單的方法。

0

我有一個類似的問題 - 但只需要修改CSS一次。 我在模塊「Site」中存儲了幾個常量 - 然後我可以在CSS中使用常量或者在整個Rails應用程序中使用常量。當Rails應用程序重新啓動並且CSS輸入文件被修改時,我會自動生成CSS文件。

你可以做同樣的事情,但在site_settings.rb 引用符號名稱,然後取那些在每個用戶的基礎上,從MongoDB的

http://unixgods.org/~tilo/Ruby/Using_Variables_in_CSS_Files_with_Ruby_on_Rails.html

0

現在讓我們假設你有一些所謂的動態動態造型.css.scss.erb(最後的.erb非常重要!)在app/assets/stylesheets中。它將由ERB(然後通過薩斯)進行處理,並且因此可以包含這樣的東西

.some_container { 
<% favorite_tags do |tag, color| %> 
.tag.<%= tag %=> { 
    background-color: #<%= color %>; 
} 
<% end %> 

}

相關問題