Хранение ряда переменных среды в направляющих и JavaScript

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

{A:3
B:4
C:5}

Мы пытаемся не встроить код направляющих в JavaScript, и мы не хотим 2 копии констант.

Спасибо!

5
задан ming yeow 24 March 2010 в 22:45
поделиться

3 ответа

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

2
ответ дан 14 December 2019 в 13:32
поделиться

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

3
ответ дан 14 December 2019 в 13:32
поделиться

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

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.

Как написано, мой код имеет дело только со строковыми константами. Вы можете проверить тип константы и соответствующим образом отрегулировать выход.

1
ответ дан 14 December 2019 в 13:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: