2011-01-18 13 views
18

Sto cercando un problema per la gestione dei css dinamici in un'app per rails. All'interno dell'app, i singoli utenti e/o gruppi di utenti possono avere un aspetto personalizzato che viene realizzato tramite CSS. Non ci sarà alcun numero fisso di file "look and feel" o css, il numero aumenterà con l'aumentare del numero di utenti e gruppi e l'aspetto e la percezione degli utenti viene definito dall'interfaccia di amministrazione dell'applicazione. Durante il corso di una giornata tipica verranno offerte migliaia (non decine di migliaia) di diverse varianti del css. L'app memorizzerà i css pre-costruiti in mongodb, quindi non ci sarà bisogno di pagare il prezzo della costruzione del css per ogni richiesta, la domanda è più su come è il modo migliore per servire questo contenuto css dinamico. Ho visto altre domande come [questa] [1] che parlano di usare erb o sass, ma alcune di queste risposte sono datate da diversi anni quindi volevo assicurarmi che non ci fosse una risposta migliore con Rails 3.Il modo migliore per gestire i css dinamici in un'app per rails

+0

Invece di memorizzare css in MongoDB, perché non memorizzarlo in un file css su disco nella directory pubblica con un nome file che è legato all'id dell'utente? In questo modo è possibile servire normalmente il css (tramite un tag di collegamento nella testa) e sfruttare il caching del browser. Ogni volta che viene apportata una modifica, è sufficiente svuotare la cache e aggiungere un cachebuster basato sul tempo di modifica al tag di collegamento src. –

risposta

38

È possibile trattare i vostri file CSS come risorse, memorizzarli sul database, e servirli con page caching, in modo che avete solo bisogno di colpire il db una volta quando il CSS viene modificato. Tutte le richieste successive saranno servite direttamente dal server web dalla cache, senza mai toccare la tua app o db.

# 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

Sto provando questo approccio ma sto incontrando un problema. Ho un'immagine di sfondo sull'elemento body nel mio css, ma questo non viene richiesto quando viene richiesto il css. –

+0

La mia immagine di sfondo viene visualizzata correttamente se uso 'background: url ('/ assets/image.jpg')' –

+0

Ho dovuto incorporare la route stylesheet_path (risorsa) e aggiungere .css al mio browser per interpretare il mio tag link come un tipo css, insieme a type = 'text/css' come questo: "# {stylesheet_link_tag (stylesheet)}. css" – dennis

3

Bene, ho lavorato con questo un paio di volte ma sono stati risolti senza alcun file CSS tra cui scegliere. Dovrebbe essere lo stesso più o meno.

Una delle cose che ho usato molto era il content_for blocchi. Fondamentalmente

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

E nel layout

 
<%= yield :css %> 

modo molto semplice per gestire i layout.

0

Ho avuto un problema simile, ma avevo bisogno di servire il CSS modificato solo una volta. Memorizzo un paio di costanti in un modulo 'Sito' - che posso quindi usare come costanti in CSS o come costanti in tutta l'applicazione Rails. I file CSS vengono generati automaticamente ogni volta che l'applicazione Rails si riavvia e i file di input CSS sono stati modificati.

Si potrebbe fare qualcosa di simile, ma fare riferimento a nomi simbolici site_settings.rb e poi andare a prendere quelli su un singolo utente da MongoDB

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

0

Ora diciamo che avete un po 'stile dinamico chiamato dinamica .css.scss.erb (il file .erb alla fine è importante!) in app/assets/stylesheets. Verrà elaborato da erb (e quindi da Sass), e come tale può contenere cose come

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

}

Problemi correlati