Лучший способ справиться с динамическим CSS в приложении Rails - PullRequest
18 голосов
/ 19 января 2011

Я исследую проблему обработки динамического CSS в приложении rails. Внутри приложения отдельные пользователи и / или группы пользователей могут иметь индивидуальный внешний вид, который достигается с помощью CSS. Не будет фиксированного количества файлов "look and feel" или css, их число будет расти по мере роста числа пользователей и групп, а внешний вид определяется пользователями через интерфейс администратора приложения. В течение обычного дня будут подаваться тысячи (а не десятки тысяч) различных вариаций css. Приложение будет хранить предварительно созданный CSS в mongodb, поэтому ему не придется платить цену за создание CSS для каждого запроса, вопрос заключается в том, как лучше всего обслуживать этот динамический контент CSS. Я видел другие вопросы, такие как [этот] [1], в которых говорится об использовании erb или sass, но некоторые из этих ответов датированы несколькими годами, поэтому я хотел убедиться, что не было лучшего ответа с Rails 3.

Ответы [ 5 ]

38 голосов
/ 19 января 2011

Вы можете рассматривать ваши CSS-файлы как ресурсы , сохранять их в базе данных и обслуживать их с помощью кэширования страниц , так что вам нужно только нажать БД один раз при изменении CSS. Все последующие запросы будут обслуживаться непосредственно веб-сервером из кэша, даже не касаясь вашего приложения или базы данных.

# 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" />
3 голосов
/ 19 января 2011

Ну, я работал с этим пару раз, но они определенно были исправлены, ни одного CSS-файла на выбор.Его должно быть то же самое более или менее.

Одной из вещей, которые я использовал много раз, были блоки content_for .В основном

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

А в макете

<%=  yield :css %>
 

очень простой способ управления макетами.

1 голос
/ 19 января 2011

Это может дать вам несколько идей: Несколько robots.txt для поддоменов в рельсах

0 голосов
/ 31 августа 2015

Теперь предположим, что у вас есть некоторый динамический стиль, называемый dynamic.css.scss.erb (в конце важен .erb!) В app / assets / stylesheets.Он будет обработан erb (а затем Sass), и поэтому может содержать такие вещи, как

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

}

0 голосов
/ 09 апреля 2011

У меня была похожая проблема - но нужно было обслуживать модифицированный CSS только один раз. Я храню пару констант в модуле «Сайт», который затем я могу использовать как константы в CSS или как константы в приложении Rails. Я автоматически генерирую файлы CSS при каждом перезапуске приложения Rails и изменении входных файлов CSS.

Вы можете сделать что-то подобное, но ссылаться на символические имена в site_settings.rb и затем извлекайте их для каждого пользователя из MongoDB

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...