分析如果在生产站点上,而不是本地或heroku子域

时间:2010-11-09 17:52:10

标签: ruby-on-rails subdomain heroku localhost analytics

这个问题是关于让分析脚本在这三种环境之一中运行。

  1. mysite.heroku.com
  2. mysite-staging.heroku.com
  3. mysite.com - 这是我唯一希望它运行的。
  4. 这就是我打算如何制定的,但欢迎提出任何建议。

    在我的帮手

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

    在我的布局中

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

    render_analytics返回布尔值:true如果在mysite.com上,false如果是local_request?或在Heroku子域上(例如:mysite.heroku.com {{ 1}} mysite-staging.heroku.com)

    那么如何才能知道它是否来自Heroku。

1 个答案:

答案 0 :(得分:1)

使用hostname

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

更清洁的解决方案是在部署期间在您的环境中设置常量,以便您知道自己是否在Heroku上。由于Heroku部署过程在让您使用配置文件方面非常不透明,因此您可能会让方法记住结果,这样每次渲染视图时都不会进行系统调用。

我刚刚用一种检查数据库适配器的方法做了类似的事情,以解释我的开发环境和Heroku之间的差异。这是我的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

请注意,除此之外,您还必须更改application.rb,以便将lib添加到您的自动加载路径中:

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