【问题标题】:Best way to handle dynamic css in a rails app在 Rails 应用程序中处理动态 CSS 的最佳方法
【发布时间】:2011-01-18 21:31:26
【问题描述】:

我正在研究在 Rails 应用程序中处理动态 CSS 的问题。在应用程序中,个人用户和/或用户组可以拥有通过 CSS 实现的自定义外观。不会有任何固定数量的“外观”或 css 文件,数量会随着用户和组数量的增长而增长,外观由用户通过应用程序的管理界面定义。在典型的一天中,将提供数千个(不是数万个)不同的 CSS 变体。该应用程序会将预先构建的 css 存储在 mongodb 中,因此它不必为每个请求支付构建 css 的价格,问题更多的是如何提供这种动态 css 内容的最佳方式。我已经看到其他问题,如 [this one][1] 与使用 erb 或 sass 相关,但其中一些答案已经过时了好几年,所以我想确保 Rails 3 没有更好的答案。

【问题讨论】:

  • 与其将 css 存储在 mongodb 中,不如将其存储在公共目录中的磁盘上 css 文件中,文件名与用户的 id 相关联?这样你就可以正常地提供css(通过头部的链接标签)并利用浏览器缓存。每当进行更改时,您只需清除缓存并将基于编辑时间的缓存拦截器添加到链接标签 src。

标签: ruby-on-rails css


【解决方案1】:

您可以将您的 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" />

【讨论】:

  • 我正在尝试这种方法,但遇到了问题。我的 css 中的 body 元素上有一个背景图片,但是在请求 css 时没有请求。
  • 如果我使用background: url('/assets/image.jpg'),我的背景图像会正确渲染
  • 我必须嵌入 stylesheet_path(resource) 路由并将 .css 添加到其中,以便我的浏览器将我的链接标签解释为 css 类型,以及 type='text/css' ,如下所示: "#{stylesheet_link_tag(stylesheet)}.css"
【解决方案2】:

好吧,我已经处理过几次了,但它们肯定没有可供选择的 CSS 文件。它应该或多或少相同。

我经常使用的东西之一是 content_for 块。基本上

// 一些 css 文件或 css 内容

在布局中

管理布局的非常简单的方法。

【讨论】:

    【解决方案3】:

    这可能会给你一些想法:Multiple robots.txt for subdomains in rails

    【讨论】:

    • 没有解释,这不是一个“答案”......但它是一个伟大的贡献。
    【解决方案4】:

    我遇到了类似的问题 - 但只需要提供一次修改后的 CSS。 我在模块“站点”中存储了几个常量——然后我可以将它们用作 CSS 中的常量或用作整个 Rails 应用程序中的常量。每当 Rails 应用程序重新启动并且 CSS 输入文件被修改时,我都会自动生成 CSS 文件。

    您可以做类似的事情,但在 site_settings.rb 中引用符号名称 然后从 MongoDB 获取每个用户的数据

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

    【讨论】:

      【解决方案5】:

      现在假设您在 app/assets/stylesheets 中有一些名为 dynamic.css.scss.erb 的动态样式(末尾的 .erb 很重要!)。它将由 erb(然后由 Sass)处理,因此可以包含类似

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

      }

      【讨论】:

        猜你喜欢
        • 2023-04-05
        • 1970-01-01
        • 2013-05-20
        • 2015-11-11
        • 2016-09-28
        • 1970-01-01
        • 2017-01-14
        • 2015-05-26
        • 1970-01-01
        相关资源
        最近更新 更多