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

Ruby on rails 如何轻松地将变量传递到.sass文件中?,ruby-on-rails,sass,Ruby On Rails,Sass,在Rails项目内部,有一个变量可以说明我们希望Rails应用程序作为哪个站点运行——例如,对于汽车或船只,以及 如果是汽车站点或船站点,则应该有不同的CSS精灵(站点徽标位于精灵内部)。传递此变量值的好方法是什么:“汽车”还是“船” 进入.sass文件,以便.sass文件将使用spritepublic/images/sprites/sprite cars.png或public/images/sprites/sprite boats.png 一种可能的方法是在config/initializer

在Rails项目内部,有一个变量可以说明我们希望Rails应用程序作为哪个站点运行——例如,对于汽车或船只,以及 如果是汽车站点或船站点,则应该有不同的CSS精灵(站点徽标位于精灵内部)。传递此变量值的好方法是什么:“汽车”还是“船” 进入.sass文件,以便.sass文件将使用sprite
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/
中放置一个
\u site\u variables.sass
并添加一行

@import "site_variables"
在main.sass文件中。在
\u site\u variables.sass
中,只需

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

这是可行的,但是仅仅传递一个变量需要做很多工作。有更简单的方法吗?

推荐的方法是定义自定义Sass函数(请参阅),并使用
:custom
选项传入特定变量。

Sass文档介绍了如何添加自定义配置变量的选项,并提到了该选项

例如,假设您想要一个函数来显示当前年份。制作一个包含以下内容的文件
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
,以强制重新生成样式表。

免责声明:我不想破坏@pdg137的答案,但我的代码太大,无法发表评论。请投他一票!没有他我是不会来这里的


以下是我的实现:

sass_helper.rb

foo.html.erb

foo.scss

这在外部公开了一个散列生成方法,我可以使用它作为选项传递给SASS插值使用


说明您不能调用外部方法,因为存在
执行上下文
,这反过来又解释了使用
的狭条排印:自定义
选项

Hi@動靜能量, 你能提供一个你为这个做了什么的示例代码吗?我也需要同样的东西,但我无法找到最好的方法?
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
se = Sass::Engine.for_file('foo.scss', :syntax => :scss, :custom => { :test => generateHash })
body-#{foo()} { ... }