簡體   English   中英

在rails應用程序中處理動態css的最佳方法

[英]Best way to handle dynamic css in a rails app

我正在研究在rails應用程序中處理動態css的問題。 在應用程序中,個人用戶和/或用戶組可以通過CSS實現自定義外觀。 沒有任何固定數量的“外觀”或css文件,數量將隨着用戶和組數量的增長而增長,並且用戶通過應用程序的管理界面定義外觀。 在整個典型的一天中,將提供數千(不是數萬)不同的css變體。 該應用程序將預先構建的css存儲在mongodb中,因此它不必為每個請求支付構建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" />

好吧,我曾經使用過幾次,但他們肯定沒有CSS文件可供選擇。 它應該或多或少相同。

我使用的很多東西之一是content_for塊。 基本上

<% content_for :css do %>
 // some css file or css content
<% end %>

並在布局中

<%=  yield :css %>

管理布局的非常簡單的方法。

這可能會給你一些想法: rails中的子域名的多個robots.txt

現在讓我們假設你在app / assets / stylesheets中有一些名為dynamic.css.scss.erb的動態樣式(最后的.erb很重要!)。 它將由erb(然后由Sass)處理,因此可以包含類似的東西

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

}

我遇到了類似的問題 - 但只需要修改一次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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM