0

ich den Edelstein rails/webpack bin mit dem Vermögen zu bauen, aber ich brauche eine dynamische SCSS nach durch eine Marke aufzubauen, wie:SASS Last dynamische Variablen webpack innerhalb Schienen

//admin.scss 
@import 'variables-<%= 'brand-name' %>'; 

body { 
    background: $primary-color; 
} 

Ich habe versucht, das Hinzufügen des Laders:

{ 
    test: /\.scss(\.erb)?/, 
    loader: 'sass-loader', 
    options: { importExtensions: ['.scss', '.scss.erb', '.css'] } 
} 

aber das hat nicht funktioniert. Gibt es eine Möglichkeit, so etwas zu tun?

+2

Webpack wird keine Assets über den ERB-Interpreter ausführen - Kettenräder jedoch. Sie müssen außerdem beachten, dass Assets in der Regel zum Zeitpunkt der Bereitstellung kompiliert werden, sodass keine Variable auf Anforderung basieren kann. Eine bessere Lösung könnte darin bestehen, Klassen in Ihrem HTML-Code zu verwenden, um verschiedene Regeln in dem zu verwendenden Stylesheet festzulegen. – max

Antwort

0

Tun Sie dies in einem separaten Controller-Aktion:

layout.html.erb

<%= stylesheet_link_tag stylesheet_path() %>

Sheet Show Controller-Aktion

# Render the template to a string 
css = Sass::Engine.new(
    render_to_string("path/to/erb_template", :layout => false), 
    syntax:  :scss, 
    cache:  false, 
    read_cache: false, 
    style:  :standard, 
    sprockets: { 
    context:  self.view_context, 
    } 
).render 

# respond with the rendered string 
respond_to do |format| 
    format.css { render plain: css, :content_type => "text/css" } 
end 

Sie können dann schließen die ERB Variablen in der Vorlage. Beachten Sie, dass dies bei jeder einzelnen Ladung durch die Sass-Engine geschickt wird, so dass Sie diese bei der Produktion zwischenspeichern möchten.

Wenn Sie alle Ihre gut organisiert in separaten Dateien halten möchten, legen Sie einfach Ihre Variablen in eine Datei, um als ERB und den Rest nur als Textdateien einzulesen.

rendered_sass = [render_to_string("stylesheets/colours", :layout => false), 
    File.read(Rails.root.join("app", "javascript", "stylesheets", "main.scss")), 
    File.read(Rails.root.join("app", "javascript", "stylesheets", "base.scss")), 
    File.read(Rails.root.join("app", "javascript", "stylesheets", "reset.scss")), 
    File.read(Rails.root.join("app", "javascript", "stylesheets", "type.scss")), 
    File.read(Rails.root.join("app", "javascript", "stylesheets", "layout.scss")), 
    File.read(Rails.root.join("app", "javascript", "stylesheets", "map.scss")), 
    File.read(Rails.root.join("app", "javascript", "stylesheets", "audio-player.scss")), 
    File.read(Rails.root.join("app", "javascript", "stylesheets", "slider.scss"))].join("\n\r") 
+0

wow, was für eine Lösung :) vielleicht versuche ich es, aber für den Moment, ich erstelle eine .scss-Datei für jede Firma und im Layout, ich importiere sie: '' <% = stylesheet_pack_tag 'Login-' + @company .sub_domain%> '' ' nicht die beste Lösung, aber es löste teilweise mein Problem. –