2011-01-18 36 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 %> 

}

相关问题