我正在研究在rails应用程序中处理动态css的问题。在应用程序中,个人用户和/或用户组可以通过CSS实现自定义外观。没有任何固定数量的“外观”或css文件,数量将随着用户和组数量的增长而增长,并且用户通过应用程序的管理界面定义外观。在整个典型的一天中,将提供数千(不是数万)不同的css变体。该应用程序将预先构建的css存储在mongodb中,因此它不必为每个请求支付构建css的代价,问题更多的是如何提供这个动态css内容的最佳方式。我已经看过其他问题,如[这一个] [1],说使用erb或sass,但其中一些答案已经过了几年,所以我想确保Rails 3没有更好的答案。 / p>
答案 0 :(得分:38)
您可以将您的CSS文件视为资源,将它们存储在数据库中,并使用page caching提供它们,这样您只需要点击db 一次修改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" />
答案 1 :(得分:3)
好吧,我曾经使用过几次,但他们肯定没有CSS文件可供选择。它应该或多或少相同。
我使用的很多东西是 content_for 块。基本上
<% content_for :css do %> // some css file or css content <% end %>
并在布局中
<%= yield :css %>
管理布局的非常简单的方法。
答案 2 :(得分:1)
这可能会给您一些想法:Multiple robots.txt for subdomains in rails
答案 3 :(得分: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
答案 4 :(得分:0)
现在假设您在app / assets / stylesheets中有一些名为dynamic.css.scss.erb的动态样式(最后的.erb很重要!)。它将由erb(然后由Sass)处理,因此可以包含诸如
之类的内容.some_container {
<% favorite_tags do |tag, color| %>
.tag.<%= tag %=> {
background-color: #<%= color %>;
}
<% end %>
}