2011-01-18 34 views
18

Bir ray uygulamasında dinamik css işlemek için bir sorun araştırıyorum. Uygulama içinde, bireysel kullanıcılar ve/veya kullanıcı grupları, CSS ile gerçekleştirilen kişiselleştirilmiş görünüm ve hislere sahip olabilir. Herhangi bir sabit sayıda "görünüm ve his" veya css dosyası olmayacak, kullanıcı ve grup sayısı arttıkça sayı artacak, uygulamanın kullanıcı arayüzü ile görünüm ve his kullanıcı tarafından tanımlanacaktır. Tipik bir gün boyunca binlerce (on binlerce değil) css farklı varyasyonları sunulacak. App önceden inşa css mongodb saklayacaktır, böylece her istek için css inşa fiyatı ödemek zorunda kalmayacak, soru bu dinamik css içeriği kadar hizmet için en iyi yoldur. Erb veya sass kullanarak konuştuğu [1] [1] gibi başka sorular gördüm, ama bu cevapların bir kısmı birkaç yıl öncesine dayanıyordu, bu yüzden Rails 3 ile daha iyi bir cevap olmadığından emin olmak istedim.Raylar uygulamasında dinamik css'yi işlemenin en iyi yolu

+0

yerine MongoDB içinde css depolanması, neden bunu bir disk css dosyasında saklamak değil}

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

gibi şeyler içerebilir Genel dizinde, kullanıcının kimliğine bağlı bir dosya adıyla? Böylelikle css'ye normal olarak (kafadaki bir bağlantı etiketi aracılığıyla) hizmet verebilir ve tarayıcı önbelleğe almanın avantajlarından yararlanabilirsiniz. Bir değişiklik yapıldığında, önbelleği temizleyebilir ve bağlantı etiketi src'ye bir düzenleme zamanı tabanlı önbellek bozucusu ekleyebilirdiniz. –

cevap

38

sen , kaynakların olarak CSS dosyaları tedavi veritabanı üzerinde saklayın ve sadece bir kez db vurmak gerekir, böylece page caching ile onlara hizmet edebilir CSS değiştirildiğinde. Tüm sonraki istekler, uygulamanıza veya db'ye dokunmadan doğrudan önbellekten web sunucusu tarafından sunulacaktır.

# 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

Bu yaklaşımı deniyorum ancak bir soruna dönüşüyorum. CSS'mdeki gövde öğesinde bir arka plan resmim var ancak css istenildiğinde bu istenmiyor. –

+0

Arka plan resmim 'background: url ('/assets/image.jpg ') ' –

+0

kullanmam durumunda doğru bir şekilde oluşturuluyor: stylesheet_path (resource) yolunu yerleştirmem ve tarayıcımın link etiketini css tipi ile birlikte type = 'text/css' gibi: "# {stylesheet_link_tag (stylesheet)}. css" – dennis

3

Eh, kez bu birkaç ile çalıştım ama kesinlikle seçim CSS dosyalarının hiçbir sabitlendi. Onun az çok aynı olmalı.

Çok kullandığım şeylerden biri content_for bloklarıydı. Temelde

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

Ve

 
<%= yield :css %> 

çok basit bir yolu düzenleri yönetmek için düzeninde

.

0

Benzer bir sorunum vardı - ancak değiştirilmiş CSS'ye yalnızca bir kez hizmet vermesi gerekiyordu. Bir 'Site' modülünde birkaç sabiti saklıyorum - daha sonra CSS'de sabit olarak veya Rails uygulaması boyunca sabit olarak kullanabiliyorum. Rails uygulaması yeniden başlatıldığında ve CSS giriş dosyaları her değiştirildiğinde CSS dosyalarını otomatik olarak oluşturur.

Sen benzer bir şey, ama site_settings.rb yılında sembolik isimleri başvuru ve sonra en dinamik denilen bazı dinamik stil var diyelim MongoDB Şimdi

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

0

gelen her kullanıcı temelinde bu alamadan .css.scss.erb (sondaki .erb önemlidir) app/assets/stylesheets. Bu erb tarafından (ve sonra Sass) işlenecektir ve gibi

İlgili konular