Каков наилучший способ генерирования специфичных для среды файлов для проекта Rails? - PullRequest
1 голос
/ 29 декабря 2008

У меня есть некоторые настройки, которые мне нужны в файле Javascript - серверах для подключения, - которые меняются в зависимости от моей среды. Для development, test и staging я хочу использовать промежуточные серверы; для production производственных серверов. У меня уже есть настройки в Ruby (настроенные в моих environment/xyz.rb файлах). До сих пор я динамически создавал файлы JS во время запроса с файлом application.js.erb и пользовательским маршрутом. Это довольно медленный процесс, и он означает создание дополнительного контроллера и каталога представлений только для этого файла.

Я бы предпочел иметь файл шаблона и задачу rake, которая генерирует правильную версию из шаблона и помещает статический файл в каталог public/javascripts. Кто-нибудь пробовал что-то подобное? Что вы использовали для рендеринга? Где вы положили файл шаблона и код рендеринга?

Или лучше просто сохранить динамическую версию и сохранить ее в рабочем состоянии?

Ответы [ 2 ]

3 голосов
/ 29 декабря 2008

Можете ли вы сделать что-то подобное?

<% javascript_include_file "#{RAILS_ENV}.js" %>

Я делаю нечто подобное, но не с файлом JS, а с некоторыми файлами RB ... и делаю это по той же причине, определяя, к каким серверам подключаться.

Для меня в моем каталоге "lib" есть файл rb, который называется "constants.rb". В этом файле есть несколько операторов if, которые переключаются в зависимости от среды (разработка, тестирование, подготовка или производство), которые переключают значения IP-адресов, к которым мне нужно присоединиться. Это достаточно бодро для моих целей на огромном компьютере, на котором запущено приложение.

Вот пример:

if ENV['RAILS_ENV'] != "production" ## if the rails environment is development or staging then use the test server
  @@IP_ADDRESS = "10.16.121.173" ## the test server
else ## if the Rails environment is production, then use the live server.
  @@IP_ADDRESS = "10.16.8.44" ## The is the shared IP address
end
0 голосов
/ 30 декабря 2008

Использование rake task для генерации этих файлов javascript - это действительно вариант. Я использую задачи rake для создания файлов перевода i18n для интерфейса JS из файлов перевода в формате YAML. Одним из вариантов является использование ERB для шаблонов. Я бы поставил rakefile под lib/tasks/foo.rake и шаблоны под lib/tasks/foo/foo.erb. Если ваш шаблон JS не очень сложен, я бы предложил использовать простой метод Hash.to_json для генерации содержимого JavaScript:

namespace :js do
  task :generate_config => :environment do
    File.open("#{RAILS_ROOT}/public/javascripts/configuration.js", 'w') do |out|
      config = {:option_1 => 'Value 1', :option_2 => 'Value 2'}
      out << "var CONFIG = #{config.to_json}"
    end
  end
end

Но файлы конфигурации - это то, что вы просто не хотите забывать восстанавливать, когда ваши исходные данные конфигурации были изменены. Я использую решение для создания «минимизированных» файлов JS в производственной среде, чтобы добавлять огромное количество файлов JavaScript вместе, чтобы я мог сэкономить на HTTP-запросах. Но вы можете использовать в основном то же решение. Это прекрасно работает, если вы используете Capistrano для развертывания своего приложения.

В файле app/helpers/application_helper.rb создать новый вспомогательный метод, доступный по всему миру:

module ApplicationHelper
  def javascript_include_config_tag
    if ActionController::Base.perform_caching
      unless File.exists?("#{RAILS_ROOT}/public/javascripts/configuration.js")

        #
        # TODO: Generate configuration data in here
        #
        config = 'configuration file contents'

        File.open("#{RAILS_ROOT}/public/javascripts/configuration.js", 'w') do |out|
          out << config
        end
      end
      javascript_include_tag('configuration')
    else
      # Link to js generated dynamically on each request. Useful in development.
      javascript_include_tag('PATH_TO_DYNAMICALLY_GENERATED_JS')
    end
  end
end

И, на ваш взгляд, вы просто включаете JavaScript с

<%= javascript_include_config_tag %>

Идея в том, что этот файл конфигурации JS генерируется только первый раз при загрузке страницы после нового развертывания Capistrano. Он также имеет огромный недостаток: вы не можете запросить файл configuration.js перед созданием первой страницы, но в моем приложении он до сих пор работает нормально.

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