0

我有一个服务于多个域的 Rails 2 应用程序。也就是说,http://domainA.comhttp://domainB.com都由同一个 Rails 应用程序提供服务。site当我手动启动这些时,我通过传递一个变量来指定我想要查看的站点: site=domainB ruby script/server.

我想使用 Pow 以便我可以通过http://domainA.myapp.devhttp://domainB.myapp.dev访问这两个站点(我也会对http://domainA.devhttp://domainB.dev如果这更容易)。

我可以通过添加export site="domainB"到我的.powrc文件中手动执行此操作,并在每次我想切换站点时手动编辑(然后执行touch tmp/restart.txt)......不过,我更喜欢自动的东西。我正在考虑类似于文件subdomain == domainA ? export site="domainA" : export site="domainB"内的.powrc内容。

4

2 回答 2

0

我已经编写了以下 rake 任务来切换站点,rake pow[SITENAME]直到找到更自动化的解决方案。此代码也可用作Gist

desc "Switches site that Pow serves"
task :pow, :site_name do |t, args|
  pow_config = "#{Rails.root}/.powrc"
  args.with_defaults(:site_name => "domainA")

  # Overwrite .powrc file with new site name
  file = File.open(pow_config, 'w')
  file.write "if [ -f \"$rvm_path/scripts/rvm\" ] && [ -f \".rvmrc\" ]; then
source \"$rvm_path/scripts/rvm\"
source \".rvmrc\"
fi

export site=#{args.site_name}"
  file.close

  # Restart Pow
  FileUtils.touch "#{Rails.root}/tmp/restart.txt"

  # Announce site change
  puts "Switched to #{args.site_name}"
end
于 2012-06-08T20:37:55.930 回答
0

我想出了如何做到这一点,并在这里写了一篇关于它的博客文章。这是它如何完成的要点......

我将 my 配置before_filter为获取正在访问的域,并在整个 Rails 应用程序中使用它。如果通过标准 Rails 应用程序访问该站点,它将没有域(它只是localhost)。在这种情况下,before_filter查找site在命令行中传递的变量(如果未传递,则使用默认站点)。

def set_site
  if RAILS_ENV == "development"
    session[:site] = case request.domain
      when "domainA.dev" then "domainA"
      when "domainB.dev" then "domainB"
      else ENV['site'] || "domainA"
    end
  else session[:site].blank?
    if RAILS_ENV == "staging"
      session[:site] = case request.subdomains.last # *.yourstagingdomain.com
        when "domainA" then "domainA"
        when "domainB" then "domainB"
      end
    elsif RAILS_ENV == "production"
      session[:site] = case request.domain
        when "domainA.com" then "domainA"
        when "domainB.com" then "domainB"
        else "domainA"
      end
    else
      session[:site] = "domainA" # default
    end
  end
  if @site.nil?
    @site ||= Site.find_by_name(session[:site])
  end
end

整个事情实际上是在 Rails 本身内完成的,Pow 唯一参与的是 Rails 应用程序服务的每个站点都必须有一个符号链接。

符号链接还必须与request.domainbefore_filter. 因此,在此示例中,将有两个符号链接 -domainAdomainB.

于 2012-06-12T16:47:11.320 回答