2008-12-29 8 views
1

J'ai quelques paramètres dont j'ai besoin dans un fichier Javascript - les serveurs à connecter - qui changent en fonction de mon environnement. Pour development, test, et staging, je veux utiliser les serveurs de transfert; pour production, les serveurs de production. J'ai déjà les paramètres dans Ruby (configuré dans mes fichiers environment/xyz.rb). Jusqu'à présent, j'ai créé dynamiquement les fichiers JS à la demande avec un fichier application.js.erb et un itinéraire personnalisé. C'est assez lent, cependant, et cela signifie créer un contrôleur supplémentaire et un répertoire de vues juste pour ce fichier.Quelle est la meilleure façon de générer des fichiers spécifiques à l'environnement pour un projet Rails?

Je préférerais avoir un fichier modèle et une tâche rake qui génère la version correcte à partir du modèle et place un fichier statique dans le répertoire public/javascripts. Est-ce que quelqu'un a essayé quelque chose comme ça? Qu'avez-vous utilisé pour le rendu? Où avez-vous mis le fichier modèle et le code de rendu?

Ou est-il préférable de garder la version dynamique et la mettre en cache en production?

Répondre

3

Pouvez-vous faire quelque chose comme ça?

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

je fais quelque chose de similaire, mais il est pas un fichier JS, mais avec certains fichiers RB ... et je le fais pour la même raison, déterminer quels serveurs se connecter. Pour moi, j'ai un fichier rb dans mon "lib" répertoire appelé "constants.rb". Ce fichier contient quelques instructions if qui basculent en fonction de l'environnement (développement, test, stockage intermédiaire ou production) qui déconnecte les valeurs des adresses IP auxquelles je dois me connecter. Il est assez énergique pour mes besoins sur le monstre d'une machine sur laquelle l'application fonctionne.

Voici un exemple:

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

C'est une bonne idée. Il n'y a probablement pas de centaines, voire de dizaines d'environnements, il n'y aura donc pas de tonnes de fichiers. Je pourrais suggérer un nom légèrement plus instructif, comme "settings _ # {RAILS_ENV.downcase} .js" ou "constants _..." –

+0

Le plus informatif le nom du fichier le mieux. Je suis content que tu aimes l'idée. –

0

En utilisant la tâche de râteau pour générer ces fichiers javascript est vraiment une option. J'utilise des tâches rake pour générer des fichiers de traduction i18n pour JS frontend à partir de fichiers de traduction au format YAML. Une option consiste à utiliser ERB pour les modèles. Je mettrais rakefile sous lib/tasks/foo.rake et les modèles sous lib/tasks/foo/foo.erb. Si votre modèle de JS est pas très complexe, je suggère d'utiliser la méthode Hash.to_json simple pour générer javascript contenu:

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 

Mais fichiers de configuration sont quelque chose que vous ne voulez pas seulement d'oublier de régénérer lorsque votre configuration les données sources ont été modifiées. J'utilise une solution pour générer des fichiers JS "minifiés" sur l'environnement de production afin d'ajouter un grand nombre de fichiers javascript ensemble afin que je puisse économiser sur les requêtes HTTP. Mais vous pouvez utiliser essentiellement la même solution. Cela fonctionne très bien si vous utilisez Capistrano pour déployer votre application.

Dans le fichier app/helpers/application_helper.rb Créer une nouvelle méthode d'assistance qui est disponible dans le monde:

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 

Et à votre avis vous suffit d'inclure javascript avec

<%= javascript_include_config_tag %> 

L'idée est que ce fichier de configuration JS est en cours généré seulement la première fois sur le chargement de la page après le déploiement de Capistrano frais. Il a aussi un énorme inconvénient que vous ne pouvez pas demander configuration.js fichier avant la première page de générer, mais dans mon application, cela fonctionne très bien jusqu'à présent.

Questions connexes