2010-11-09 22 views
0

Cette question concerne l'exécution d'un script d'analyse dans l'un de ces trois environnements.analytics si sur un site de production, pas un sous-domaine local ou heroku

  1. mysite.heroku.com
  2. mysite-staging.heroku.com
  3. mysite.com - c'est le seul que je veux qu'il fonctionne sur.

Voici comment je prévois de l'exposer, mais toutes les suggestions sont les bienvenues.

Dans mon aide

def render_analytics 
    if local_request? || #on a Heroku subdomain 
    false 
    else 
    true 
    end 
end 

Dans ma mise en page

<%= render 'shared/analytics' if render_analytics %> 

render_analytics retourne un booléen: true si le mysite.com, false si un local_request? ou sur un sous-domaine Heroku (ex: monsite. heroku.com || mysite-staging.heroku.com)

Alors, comment puis-je savoir si ça vient de Heroku.

Répondre

1

Utilisation hostname:

if local_request? || `hostname` =~ /heroku/i 

Une solution plus propre est de définir une constante dans votre environnement au cours du déploiement qui vous permet de savoir si vous êtes sur Heroku. Comme le processus de déploiement Heroku est assez opaque pour vous permettre de contourner les fichiers de configuration, vous pouvez demander à votre méthode de mémoriser le résultat afin de ne pas effectuer d'appel système chaque fois que vous affichez une vue.

Je viens de faire quelque chose de similaire avec une méthode qui vérifie l'adaptateur de base de données pour tenir compte des différences entre mon environnement de développement et Heroku. Voici mon lib/adapter.rb:

class Adapter 
    cattr_reader :adapter 

    def self.postgres? 
    @@adapter ||= Rails.configuration.database_configuration[Rails.env]['adapter'] 
    adapter == 'postgresql' 
    end 

    def self.mysql? 
    @@adapter ||= Rails.configuration.database_configuration[Rails.env]['adapter'] 
    adapter == 'mysql' 
    end 

    def self.sqlite? 
    @@adapter ||= Rails.configuration.database_configuration[Rails.env]['adapter'] 
    adapter.include?('sqlite') 
    end 
end 

Notez que, en plus de cela, vous devez changer application.rb tel que lib est ajouté à votre chemin de chargement automatique:

config.autoload_paths += Dir["#{config.root}/lib/**/"] # include all subdirectories 
+0

comme dans 'initializers/constants.rb'? Dois-je inclure un pack d'action, comment le faire, je n'ai jamais vu la logique dans un fichier constant ... comment faire cela? – s84

+0

J'ai ajouté un exemple de mon propre code. –

+0

wow, merci beaucoup! – s84