我有一个Rails 2应用程序,可以为多个域提供服务。也就是说,http://domainA.com和http://domainB.com都由相同的Rails应用提供服务。当我手动启动这些时,我通过传递site
变量来指定我想要查看的网站:site=domainB ruby script/server
。
我想使用Pow,以便我可以通过http://domainA.myapp.dev和http://domainB.myapp.dev访问这两个网站(我也很满意http://domainA.dev和http://domainB.dev如果是更容易)。
我可以手动执行此操作,只需将export site="domainB"
添加到我的.powrc
文件中,然后每次我想切换网站时手动编辑(然后执行touch tmp/restart.txt
)...我但是,我更喜欢更自动的东西。我在想subdomain == domainA ? export site="domainA" : export site="domainB"
文件中等同于.powrc
的内容。
答案 0 :(得分: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
答案 1 :(得分:0)
我想出了如何做到这一点,并写了一篇关于它的博客文章here。这是它如何完成的要点......
我将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.domain
中正在检查的before_filter
匹配。因此,在此示例中,将有两个符号链接 - domainA
和domainB
。