2011-01-18 8 views
18

Estoy investigando un problema para manejar css dinámicos en una aplicación de rieles. Dentro de la aplicación, los usuarios individuales y/o grupos de usuarios pueden tener una apariencia personalizada que se logra a través de CSS. No habrá una cantidad fija de archivos "look and feels" o css, el número aumentará a medida que la cantidad de usuarios y grupos crezca y la apariencia sea definida por los usuarios a través de la interfaz de administración de la aplicación. A lo largo de un día típico, se servirán miles (no decenas de miles) de diferentes variaciones del CSS. La aplicación almacenará el CSS preconstruido en mongodb, por lo que no tendrá que pagar el precio de construir el CSS para cada solicitud, la pregunta es más acerca de cómo es la mejor manera de servir este contenido CSS dinámico. He visto otras preguntas como [ésta] [1] que hablan de usar erb o sass, pero algunas de estas respuestas tienen fecha por varios años, así que quería asegurarme de que no hubiera una mejor respuesta con Rails 3.La mejor manera de manejar CSS dinámico en una aplicación de rieles

+0

En lugar de almacenar el css en mongodb, por qué no almacenarlo en un archivo CSS en el disco en el directorio público con un nombre de archivo que está vinculado a la identificación del usuario? De esa forma, podría servir el CSS normalmente (mediante una etiqueta de enlace en la cabeza) y aprovechar el almacenamiento en caché del navegador. Cada vez que se realiza un cambio, puede borrar el caché y agregar un cachebuster basado en el tiempo de edición a la etiqueta de enlace src. –

Respuesta

38

puede tratar sus archivos CSS como recursos, almacenarlos en la base de datos, y servirlos con page caching, para que sólo tenga que pulsar el PP vez cuando se modifica el CSS. Todas las solicitudes posteriores serán servidas directamente por el servidor web desde la memoria caché, sin tocar su aplicación 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

Estoy intentando este enfoque, pero tengo un problema. Tengo una imagen de fondo en el elemento del cuerpo en mi CSS pero esto no se solicita cuando se solicita el CSS. –

+0

Mi imagen de fondo se representa correctamente si uso 'background: url ('/ assets/image.jpg')' –

+0

Tuve que incrustar la ruta de stylesheet_path (recurso) y agregarle .css para que mi navegador interprete mi etiqueta de enlace como un tipo css, junto con el tipo = 'text/css' como lo siguiente: "# {stylesheet_link_tag (stylesheet)}. css" – dennis

3

Bueno, he trabajado con esto un par de veces pero definitivamente no se han solucionado los archivos CSS para elegir. Debería ser el mismo más o menos.

Una de las cosas que utilicé mucho fue el content_for bloques. Básicamente

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

Y en la disposición

 
<%= yield :css %> 

manera muy sencilla para la gestión de los diseños.

0

Tuve un problema similar, pero necesitaba servir el CSS modificado solo una vez. Guardo un par de constantes en un módulo 'Sitio' - que luego puedo usar como constantes en CSS o como constantes en toda la aplicación Rails. Genero automáticamente los archivos CSS cada vez que se reinicia la aplicación Rails y se modifican los archivos de entrada de CSS.

Se podría hacer algo similar, pero la referencia nombres simbólicos en site_settings.rb y luego ir a buscar los de una base por usuario de MongoDB

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

0

Ahora digamos que usted tiene un poco de estilo dinámico denominado dinámico .css.scss.erb (¡el .erb al final es importante!) en app/assets/stylesheets. Que será procesada por erb (y luego por Sass), y como tal puede contener cosas como

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

}

Cuestiones relacionadas