по существу мы хотим сохранить ряд констант, которые будут использоваться через приложение для направляющих и код JavaScript. Например:
{A:3
B:4
C:5}
Мы пытаемся не встроить код направляющих в JavaScript, и мы не хотим 2 копии констант.
Спасибо!
Чтобы избежать двойного определения ваших констант, я бы использовал 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
. Хотя этот JS создается с помощью Rails, он остается отдельным от любых других файлов JS в приложении и позволяет избежать дублирования определений ваших констант.
Как упоминалось ранее, вы должны кэшировать действие JavascriptsController # constants
. Также рассмотрите возможность минимизации constants.js
(т. Е. Удаления ненужных символов) и объединения его с другими файлами JavaScript, чтобы уменьшить количество HTTP-запросов. Я использую гем AssetHat (отказ от ответственности: я написал его), который успешно ускорил CSS и JS на некоторых известных сайтах.
поместите его в файл JSON и проанализируйте его в вашем рубиновом файле и то же самое в вашем файле javascript.
Я сделал нечто похожее.
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.
Как написано, мой код имеет дело только со строковыми константами. Вы можете проверить тип константы и соответствующим образом отрегулировать выход.