在Rails项目中,有一个变量可以说明我们希望Rails应用程序运行的站点 - 例如,汽车或船只,以及
如果是汽车站点或船站点(站点徽标在精灵内),应该有不同的CSS精灵。传递此变量值的好方法是什么:“cars”或“boats”
进入.sass文件,以便.sass文件将使用精灵public/images/sprites/sprite-cars.png
或public/images/sprites/sprite-boats.png
?
一种可能的方法是在config/initializers
Sass::Plugin.options[:load_paths] = ["#{RAILS_ROOT}/app/views/templates/#{SITE_NAME}/"]
并在app/views/templates/cars/
内部放置_site_variables.sass
并添加一行
@import "site_variables"
主.sass文件中的。在_site_variables.sass
中,只需
$site_sprite_path: '/images/sprites/sprites-cars.png'
这很有效,但传递变量需要做很多工作。有更简单的方法吗?
答案 0 :(得分:5)
建议的方法是定义自定义Sass函数(请参阅the documentation)并使用:custom
选项传递特定变量。
答案 1 :(得分: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
现在你可以在Sass代码中使用这个函数,如下所示:
div#copyright
content: "© 2001–#{year()} XYZ Corporation"
您可以访问环境变量或其他配置数据,而不是当前年份。请注意,如果没有to_s
,您将收到损坏的字符串,并且在调试时请确保定期清除tmp/cache
以强制重新生成样式表。
答案 2 :(得分: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
,而后者又解释了:custom
和options
的变形问题