2012-12-19 13 views
6

Quindi ho visto molte discussioni su SO sull'utilizzo di erb nei file CSS. Posso ottenere ERB per elaborare i file CSS usando la sintassi <% =%> e aggiungendo .erb al file, ma quello di cui ho veramente bisogno è accedere alle variabili di istanza nel controller.Accesso alle variabili di istanza di Rails Controller nei CSS

searches_controller.rb

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

Quello che vorrei veramente fare è:

searches.css.scss.erb

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

ma ERB genera un errore perché @school è nullo. C'è un modo per richiedere al controller di accedere a tali variabili di istanza?

L'unico altro modo in cui posso pensare di farlo è incorporarlo come attributo di dati nelle viste e quindi utilizzare JS per modificarlo sul front-end. Questo mi sembra potenzialmente migliore in quanto il file CSS non cambierà e ogni volta dovrà essere nuovamente inviato, ma sarebbe anche molto meno elegante.

risposta

9

È inoltre necessario considerare che in uno scenario di asset precompilato, il CSS verrà eseguito tramite Pignoni durante la compilazione, quindi si otterrà un colore statico (supponendo che @school sia stato effettivamente istanziato quale non sarebbe). Questo non è auspicabile in quanto ogni scuola avrebbe lo stesso colore (qualunque cosa succedesse durante la fase di compilazione).

per il branding personalizzato come questo abbiamo lasciato i nostri utenti specificano i loro colori, e comprendono un blocco di CSS nel layout:

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

E non è l'ideale, ma se si dispone di un piccolo numero di personalizzazioni sembra lavorare abbastanza bene.

+0

Grazie. Speravo di affrontarlo al di fuori dei punti di vista, ma sembra che questa sia la strada da percorrere. – rurabe

+0

Puoi fornire maggiori dettagli sull'aggiunta di un blocco CSS a un layout ...? Mi piacerebbe scambiare le immagini in base alle dimensioni dello schermo e ho bisogno di un modo per le mie media query per vedere le mie variabili di istanza. – brntsllvn

2

Preferisco utilizzare il @school.primary_color nella visualizzazione. Questo dovrebbe funzionare:

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

Basta ricordarsi di utilizzare le virgolette doppie per l'interpolazione.

+0

Cerco di occuparmi di nil prima possibile. Quindi in questo caso, la vista non verrebbe mai nutrita con un oggetto 'nil'. Ma se questa è una preoccupazione, allora l'intera visione dovrebbe davvero essere avvolta in un condizionale. Non è specifico solo per questo utilizzo. – mehulkar

+0

Unico problema con questo è se si deve usare quel colore in più punti in più viste, si finisce con un codice piuttosto non mantenibile. –

+0

Questo è un buon punto. A seconda del numero di scuole, potrebbe essere una buona idea definire costanti nei file CSS per ogni scuola invece che nel db. – mehulkar

Problemi correlati