如何轻松地将变量传递到.sass文件?

时间:2011-05-13 20:47:28

标签: ruby-on-rails sass

在Rails项目中,有一个变量可以说明我们希望Rails应用程序运行的站点 - 例如,汽车或船只,以及 如果是汽车站点或船站点(站点徽标在精灵内),应该有不同的CSS精灵。传递此变量值的好方法是什么:“cars”或“boats” 进入.sass文件,以便.sass文件将使用精灵public/images/sprites/sprite-cars.pngpublic/images/sprites/sprite-boats.png

一种可能的方法是在config/initializers

中的init文件中使用它
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'

这很有效,但传递变量需要做很多工作。有更简单的方法吗?

3 个答案:

答案 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,而后者又解释了:customoptions的变形问题