How do I create dynamic CSS in Rails?

后端 未结 6 1982
Happy的楠姐
Happy的楠姐 2020-12-13 16:21

what is the best/most efficient way of creating dynamic CSS with Rails. I am developing an admin area on a site, where I would like a user to be able to customize the style

6条回答
  •  我在风中等你
    2020-12-13 16:43

    In Rails 3.1, you can have your stylesheets pre-processed by erb.

    Now let's say you have some dynamic styling called dynamic.css.scss.erb (the .erb at the end is important!) in app/assets/stylesheets. It will be processed by erb (and then by Sass), and as such can contain stuff like

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

    You can include it like any stylesheet.

    How dynamic should it be?

    Note that it will be only processed once, though, so if the values changes, the stylesheet won't.

    I don't think there is a super efficient way to do have it completely dynamic yet, but it is still possible to generate the CSS for all requests. With this caveat in mind, here's a helper for that in Rails 3.1:

      def style_tag(stylesheet)
        asset = YourApplication::Application.assets[stylesheet]
        clone = asset.class.new(asset.environment, asset.logical_path, asset.pathname, {})
        content_tag("STYLE", clone.body.html_safe, type:"text/css")
      end
    

    Here's how to use it:

    First, copy the above helper in app/helpers/application_helper.rb.

    You can then include it in your page as follows:

    <% content_for :head do %>
      <%= style_tag "dynamic.css" %>
    <% end %>
    The rest of your page.
    

    Make sure that your layout uses the content :head. For example, your layout/application.html.erb could look like:

    ...
    
      ....
      <%= yield :head %>
    
    ...
    

    I found this out thanks to this post.

提交回复
热议问题