Хранение набора переменных окружения в rails и javascript - PullRequest
5 голосов
/ 25 марта 2010

В сущности, мы хотим сохранить набор констант, которые будут использоваться в приложении rails и в коде javascript. Например:

{A:3
B:4
C:5}

Мы стараемся не встраивать код rails в javascript, и нам не нужны 2 копии констант.

Спасибо!

Ответы [ 3 ]

3 голосов
/ 25 марта 2010

поместите его в файл JSON и проанализируйте в файле ruby ​​и в файле javascript.

2 голосов
/ 25 марта 2010

Чтобы не определять ваши константы дважды, я бы использовал Rails для генерации JS, который содержит ваши константы. Я понимаю, что хочу избегать использования Rails в JS, но правильное разделение кода должно покрывать любые подобные проблемы.

Сначала определите ваши константы в Ruby, например, в config/environment.rb или в пользовательском инициализаторе:

CONST_A = 3
CONST_B = 4
CONST_C = 5

Затем создайте новый контроллер с одним действием, единственной целью которого является чтение значений Ruby и вывод их в виде JavaScript. Например:

class JavascriptsController < ApplicationController
  caches_page :constants

  def constants
    render :template => 'constants.js.erb'
  end
end

Обратите внимание, что действие кэшируется на странице, чтобы избежать ненужных попаданий в стек Rails.

Теперь создайте представление app/views/javascripts/constants.js.erb, в котором вы выводите значения Ruby как объект JavaScript:

var constants = {
  a: <%= CONST_A %>,
  b: <%= CONST_B %>,
  c: <%= CONST_C %>
};

Подключите простой маршрут в config/routes.rb для подключения к JavascriptsController действиям:

map.connect '/javascripts/:action.js', :controller => 'javascripts'

Наконец, включите этот JS в свой макет перед любым другим JS:

<%= javascript_include_tag 'constants' %>

Это должно сделать это. Эта строка запрашивает /javascripts/constants.js, которая затем определяет объект JS constants. Хотя этот JS генерируется с помощью Rails, он остается отдельным от любых других файлов JS в приложении и избегает дублирования определений ваших констант.

Как упоминалось ранее, вы должны кэшировать действие JavascriptsController#constants. Также рассмотрите возможность минимизации constants.js (т. Е. Удаления ненужных символов) и конкатенации его с другими файлами JavaScript для сокращения HTTP-запросов. Я использую AssetHat gem (заявление об отказе: я написал его), который успешно ускорил CSS и JS на некоторых высококлассных сайтах.

1 голос
/ 26 марта 2010

Я сделал что-то похожее.

class Constants
  DUCK = "Quack"
  CAT = "Meow"
  PROGRAMMER = "Tap,tap,tap."

  def self.make_javascript
    output = ""
    self.constants.each do |c|
      output += "var #{c} = \"#{self.send(c)}\";\n"
    end
    return output
  end
end

Тогда в вашем файле макета, где-то в голове напишите:

<script type='text/javascript'>
  <%= Constants.make_javascript %>
</script>

Это делает его таким, что добавление константы в класс автоматически добавит его в javascript.

Как написано, мой код имеет дело только со строковыми константами. Вы можете проверить тип константы и соответственно настроить выход.

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