2012-06-08 56 views
0

我有一個服務於多個域的Rails 2應用程序。也就是說,http://domainA.comhttp://domainB.com都由相同的Rails應用程序提供服務。當我手動啓動這些功能時,我通過傳遞site變量來指定要查看的網站:site=domainB ruby script/server是否可以使用.powrc文件根據所訪問的URL將會話變量傳遞給Rails?

我想使用戰俘,這樣我可以通過http://domainA.myapp.devhttp://domainB.myapp.dev訪問這兩個網站(我也很樂意與http://domainA.devhttp://domainB.dev如果這是更容易)。

我可以通過添加export site="domainB".powrc文件中手動做到這一點,和編輯,通過手(然後做touch tmp/restart.txt)我想改用網站每一次...我喜歡的東西多一點自動,雖然。我正在考慮類似.powrc文件中的subdomain == domainA ? export site="domainA" : export site="domainB"

回答

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內部本身完成,而戰俘擁有國內唯一的參與是必須有由Rails應用程序被服務的每個站點的一個符號鏈接。

符號鏈接還必須匹配在before_filter中檢查的request.domain。因此,在這個例子中會有兩個符號鏈接 - domainAdomainB

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 
相關問題