Чтобы не определять ваши константы дважды, я бы использовал 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 на некоторых высококлассных сайтах.