Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在rails应用程序中处理动态css的最佳方法_Ruby On Rails_Css - Fatal编程技术网

Ruby on rails 在rails应用程序中处理动态css的最佳方法

Ruby on rails 在rails应用程序中处理动态css的最佳方法,ruby-on-rails,css,Ruby On Rails,Css,我正在研究一个在rails应用程序中处理动态css的问题。在应用程序中,个人用户和/或用户组可以通过CSS定制外观和感觉。不会有任何固定数量的“外观”或css文件,该数量将随着用户和组数量的增加而增加,并且外观由用户通过应用程序的管理界面定义。在一个典型的一天中,成千上万(而不是数万)不同版本的css将被提供。该应用程序将在mongodb中存储预构建的css,因此它不必为每个请求支付构建css的费用,问题更多的是如何最好地提供这种动态css内容。我也看到过类似于[1]的其他问题涉及到使用erb或

我正在研究一个在rails应用程序中处理动态css的问题。在应用程序中,个人用户和/或用户组可以通过CSS定制外观和感觉。不会有任何固定数量的“外观”或css文件,该数量将随着用户和组数量的增加而增加,并且外观由用户通过应用程序的管理界面定义。在一个典型的一天中,成千上万(而不是数万)不同版本的css将被提供。该应用程序将在mongodb中存储预构建的css,因此它不必为每个请求支付构建css的费用,问题更多的是如何最好地提供这种动态css内容。我也看到过类似于[1]的其他问题涉及到使用erb或sass,但其中一些答案已经过时了好几年,所以我想确定Rails 3没有更好的答案。

这可能会给你一些想法:

你可以将CSS文件作为资源来处理,将它们存储在数据库中,并为它们提供,这样当CSS被修改时,您只需点击db一次。所有以后的请求都将由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" />
#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”没有解释之外,这并不是一个“答案”。。。但这是一个巨大的贡献。