2011-05-13 47 views
7

在Rails項目中,有一個變量可以說明我們希望Rails應用程序運行的位置 - 例如,對於汽車或小船,並且如果它是汽車站點,則應該有不同的CSS精靈或一個船隻網站(網站標誌是在精靈之內)。將這個變量值:「cars」或「boats」 傳遞到.sass文件中,以便.sass文件將使用精靈public/images/sprites/sprite-cars.pngpublic/images/sprites/sprite-boats.png如何輕鬆地將變量傳遞給.sass文件?

一種可能的方式是在init文件中config/initializers

Sass::Plugin.options[:load_paths] = ["#{RAILS_ROOT}/app/views/templates/#{SITE_NAME}/"] 

和裏面的app/views/templates/cars/_site_variables.sass有使用,並在主.sass文件中添加一行

@import "site_variables" 

。在_site_variables.sass,只是有

$site_sprite_path: '/images/sprites/sprites-cars.png' 

這工作,但它是一個大量的工作,只是傳遞一個變量。有一種更簡單的方法嗎?

回答

5

推薦的方法是定義一個自定義的Sass函數(請參閱the documentation)並使用:custom選項來傳遞您的特定變量。

+1

嗨@動靜能量,你能舉出一個你爲此做了什麼樣的代碼?我需要同樣的東西,我無法弄清楚最好的方法嗎? – 2012-11-19 07:18:01

+2

請添加一個如何完成的例子。 – gotqn 2014-05-04 13:09:04

3

Sass文檔介紹瞭如何爲自定義配置變量添加custom functions並提及選項:custom

例如,假設您想要一個函數來顯示當前年份。使文件lib/sass_year.rb包含以下內容:

require 'sass' 
require 'sass/script' 

module Sass::Script::Functions 
    def year 
    Sass::Script::Value::String.new(Sass::Plugin.options[:custom][:year]) 
    end 
end 

然後,在一些地方像environment.rb,包括並將其配置如下:

require Rails.root+'lib/sass_year' 
require 'sass/plugin' 
Sass::Plugin.options[:custom] ||= {} 
Sass::Plugin.options[:custom][:year] = Time.now.year.to_s 

現在你可以使用薩斯代碼中的功能是這樣的:

div#copyright 
    content: "© 2001–#{year()} XYZ Corporation" 

而不是當年,您可以訪問環境變量或其他配置數據。請注意,如果沒有to_s,您將得到一個損壞的字符串,並且在調試時確保定期清除tmp/cache以強制重新生成樣式表。

+0

這是令人難以置信的幫助。謝謝。 – shroy 2017-02-15 23:03:02

0

聲明:我討厭破壞@ pdg137的答案,但是我的代碼太大而不能發表評論。請高舉他!沒有他,我不會來這裏。


這裏是我的實現:

sass_helper.rb

require 'sass' 
require 'sass/script' 

module SassHelper 
    def generateHash 
    "asdf" 
    end 

    module Sass::Script::Functions 
    def foo() 
     Sass::Script::Value::String.new(options[:custom][:test]) 
    end 
    end 
end 

foo.html.erb

se = Sass::Engine.for_file('foo.scss', :syntax => :scss, :custom => { :test => generateHash }) 

FOO。SCSS

body-#{foo()} { ... } 

這外部暴露出的散列生成方法,我可以使用通過作爲由SASS插值來消耗的選項。

Calling SCSS functions from Ruby解釋說,你不能調用外部方法,因爲有一個ExecutionContext,這反過來又解釋了:customoptions搪塞。