Как легко передать переменную в файл .sass? - PullRequest
7 голосов
/ 14 мая 2011

Внутри проекта 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'

. Это работает, но очень просто передать переменную.Есть ли более простой способ?

Ответы [ 3 ]

5 голосов
/ 14 мая 2011

Рекомендованный способ сделать это - определить пользовательскую функцию Sass (см. документацию ) и использовать опцию :custom для передачи ваших конкретных переменных.

3 голосов
/ 01 января 2016

Документация Sass описывает, как добавить пользовательские функции и упоминает опцию :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 для принудительного восстановления таблицы стилей.

0 голосов
/ 20 апреля 2017

Отказ от ответственности: я не хочу подрывать ответ @ 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.

Вызов функций SCSS из Ruby объясняет, что вы не можете вызывать внешние методы, потому что есть ExecutionContext, который, в свою очередь, объясняет обход с помощью :custom и options.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...