Ruby on rails 在rails应用程序中处理动态css的最佳方法
我正在研究一个在rails应用程序中处理动态css的问题。在应用程序中,个人用户和/或用户组可以通过CSS定制外观和感觉。不会有任何固定数量的“外观”或css文件,该数量将随着用户和组数量的增加而增加,并且外观由用户通过应用程序的管理界面定义。在一个典型的一天中,成千上万(而不是数万)不同版本的css将被提供。该应用程序将在mongodb中存储预构建的css,因此它不必为每个请求支付构建css的费用,问题更多的是如何最好地提供这种动态css内容。我也看到过类似于[1]的其他问题涉及到使用erb或sass,但其中一些答案已经过时了好几年,所以我想确定Rails 3没有更好的答案。这可能会给你一些想法:你可以将CSS文件作为资源来处理,将它们存储在数据库中,并为它们提供,这样当CSS被修改时,您只需点击db一次。所有以后的请求都将由web服务器直接从缓存中提供,而不会触碰您的应用程序或数据库Ruby on rails 在rails应用程序中处理动态css的最佳方法,ruby-on-rails,css,Ruby On Rails,Css,我正在研究一个在rails应用程序中处理动态css的问题。在应用程序中,个人用户和/或用户组可以通过CSS定制外观和感觉。不会有任何固定数量的“外观”或css文件,该数量将随着用户和组数量的增加而增加,并且外观由用户通过应用程序的管理界面定义。在一个典型的一天中,成千上万(而不是数万)不同版本的css将被提供。该应用程序将在mongodb中存储预构建的css,因此它不必为每个请求支付构建css的费用,问题更多的是如何最好地提供这种动态css内容。我也看到过类似于[1]的其他问题涉及到使用erb或
# 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" />
#stylesheet.rb
类样式表@stylesheet.contents,:content\u type=>“text/css”}
结束
结束
#其余的是典型的RESTful控制器,
#只要记住在样式表更改时使缓存过期
结束
#routes.rb
资源:样式表
#layouts/application.html.erb
…
好吧,我已经使用过几次了,但它们肯定是固定的,没有CSS文件可供选择。它应该大致相同
我经常使用的东西之一是块的内容。基本上
<% content_for :css do %>
// some css file or css content
<% end %>
//一些css文件或css内容
在布局中
<%= yield :css %>
管理布局的非常简单的方法 我也遇到了类似的问题,但只需要为修改后的CSS服务一次。 我在一个模块“Site”中存储了几个常量,然后我可以将它们用作CSS中的常量或整个Rails应用程序中的常量。每当Rails应用程序重新启动并且CSS输入文件被修改时,我就会自动生成CSS文件 您可以执行类似的操作,但请在site_settings.rb中引用符号名称 然后根据每个用户从MongoDB中获取这些数据
现在让我们假设您在app/assets/stylesheets中有一些名为dynamic.css.scss.erb的动态样式(末尾的.erb很重要!)。它将由erb(然后由Sass)处理,因此可以包含如下内容
.some_container {
<% favorite_tags do |tag, color| %>
.tag.<%= tag %=> {
background-color: #<%= color %>;
}
<% end %>
。一些容器{
.标签{
背景色:#;
}
}与其将css存储在mongodb中,为什么不将其存储在公共目录中的磁盘css文件中,文件名与用户id绑定?这样,您就可以正常地为css服务(通过头部的链接标记),并利用浏览器缓存。无论何时进行更改,您都可以清除缓存并向链接标记src添加一个基于编辑时间的cachebuster。我在css中的body元素上有一个背景图像,但在请求css时不会请求它。如果我使用
background:url('/assets/image.jpg')
我必须嵌入样式表路径(resource)并向其中添加.css,以便我的浏览器将我的链接标记解释为css类型,我的背景图像将正确呈现,除了像这样的type='text/css':#{stylesheet_link_tag(stylesheet)}.css”没有解释之外,这并不是一个“答案”。。。但这是一个巨大的贡献。