Подтвердить что ты не робот

Могут ли хеши Ruby быть включены в Sass и CoffeeScript, позволяя делиться данными?

Мне интересно, может ли хэш-рубин делиться между Sass и CoffeeScript с минимумом суеты.

Я искал ответ на этот вопрос, но не нашел ничего убедительного. Источники, такие как documentation для Sass, расскажите о том, как связать файлы одного и того же типа и как управлять структурами данных в языке, но не касайтесь того, можно ли импортировать данные из других источников или можно ли интерпретировать код ruby ​​каким-либо образом - только аналогичные вещь, о которой я могу думать, это компас с использованием файла .rb для его конфигурации.

Мой инстинкт предполагает, что это (или должно) быть возможно, оба языка похожи на Ruby и способны интерпретировать хеши.

Поскольку это практическая проблема, с которой я столкнулся несколько раз (DRYing pre-processing front end code, но также предоставляющий одинаковые значения для обработки на заднем плане, такие как создание SVG в HTML-шаблоне), но никогда не решался в действительно чистом виде я бы принял решение, которое связано с использованием Rails.

Обратите внимание, что я довольно подробно отношусь к этому вопросу, касающемуся стадии предварительной компиляции производства конечных активов, а именно Sass и CoffeeScript. Ответы, которые связаны с CSS, JavaScript или требуют браузера, не являются тем, что я ищу.

Дополнительные биты

Я решил добавить пример, вот три определения тех же данных, что и пары ключевых значений:

Ruby

colours = { brandBackground: '#f00', brandForeground: '#00f', brandText: '#0f0' }
colours[:brandBackground]

Сасс-карта

$colours: ( brandBackground: '#f00', brandForeground: '#00f', brandText: '#0f0' )
map-get($colours, brandBackground)

CoffeeScript

colours = { brandBackground: '#f00', brandForeground: '#00f', brandText: '#0f0' }
colours.brandBackground

Определения Coheescript и Ruby идентичны, Sass очень близок... если это может сработать, тогда цвета (или любая другая переменная) могут быть определены в одном месте, а затем использоваться по всему фронту и обратно с помощью любого кода.

4b9b3361

Ответ 1

Вы можете превратить свой CoffeeScript и SASS в шаблоны ERB, которые будут предварительно обработаны (и, следовательно, вы сможете использовать в них все потрясающие возможности Ruby). Существует небольшое сообщение, которое описывает это: https://robots.thoughtbot.com/dont-repeat-your-ruby-constants-in-javascript.

Обновление

Добавьте этот код в lib/shared_assets_data.rb:

module SharedAssetsData
  def self.colors_hash
    { brandBackground: '#f00', brandForeground: '#00f', brandText: '#0f0' }
  end

  def self.sassify(hash)
    hash.map do |key, value|
      "#{key}: '#{value}'"
    end.join(', ').prepend('( ').concat(' )')
  end

  def self.coffefy(hash)
    hash.map do |key, value|
      "#{key}: '#{value}'"
    end.join(', ').prepend('{ ').concat(' }')
  end
end

Затем, чтобы включить автозагрузку каталога lib, добавьте эту строку в config/application.rb:

config.autoload_paths += %W(#{Rails.root}/lib)

После этого вы можете сделать следующее:

# screen.sass.erb
$colours: <%= SharedAssetsData.sassify(SharedAssetsData.colors_hash) %>
body
  background: map-get($colours, brandBackground)

# screen.coffee.erb
colours = <%= SharedAssetsData.coffefy(SharedAssetsData.colors_hash) %>
console.log colours.brandBackground

Ответ 2

Думаю, лучше всего использовать gon. Gon - это драгоценный камень, который позволяет передавать рубиновые переменные в javascript/coffeescript. Оттуда вы можете встроить стиль, который использует рубиновый хеш.

Sass/CSS действительно относятся только к стилям, и хотя Sass может иметь переменные и делать математику, вы не должны использовать его как хранилище для более сложных структур данных, это сделает ваш код очень сложным в обслуживании. Хранение и транспортировка данных просто не является задачей Sass.

Итак, что касается Гон. Попробуйте что-то вроде этого в контроллере:

gon.ruby_hash = {key: value}

теперь у вас coffeescript:

gon.ruby_hash

Вы можете получить доступ к хешу, вызвав gon.ruby_variable_name.