2013-07-21 48 views
0
class ApplicationController < ActionController::Base 
    before_filter :store_ref_url 

    def store_ref_url 
    rf = request.referer 
    if ((URI(rf.to_s).host != "dev-beta.foo.com") && (URI(rf.to_s).host != "beta.foo.com") && URI(rf.to_s).port != "3000") 
     session['referer'] = request.referer 
    end 
    end 
end 

如果域是「dev-beta.foo.com」或「beta.foo.com」或端口是3000在我的本地機器,我不想保存我的會話['referer']中的request.referer。但它仍然繼續保存它。我已經嘗試了幾個條件。我究竟做錯了什麼?Rails3 URI()如果條件不起作用

+0

你試過這個之前檢查過你的'session'嗎?你什麼時候清理會議?您是否有可能早先設置了會話,並且在連續嘗試中您認爲會話正在設置? if條件看起來不錯。 – vee

+0

是的,我在我看來使用<%= debug session ['referer'] - %>來檢查它。在我的控制器中重定向後,我將它設置爲零。我真的認爲if語句很好,但我不知道爲什麼它不起作用。 –

+0

看到我下面的評論。最後一個條件是將一個Fixnum與一個字符串「3000」進行比較,所以顯然這個邏輯不能執行你想要的。只需打開一個控制檯並逐一測試所有內容,這將花費更少的時間。 – tyler

回答

0

一對夫婦的建議:

它看起來像你想確定,當你在升級或開發與生產運行,在這種情況下,你可以簡單地使用:

Rails.env.production? 

要獲取該信息。您也可以設置一個臨時環境來部署在您的dev-beta.foo.com網站上,您可以使用Rails.env.staging?相同的方式。

要調試您所問的具體問題,只需找出request.referer變量對未通過測試的請求的要求,然後打開一個控制檯並逐個測試您的邏輯條件,然後一起查看什麼樣的條件失敗。最後,我的個人偏好是看到放在過濾器本身之前的邏輯條件,但這可能不是普遍的情感。

編輯 我可能還補充說,你最後的條件!= "3000"可能沒有做任何事;我不認爲port方法返回一個字符串...

+0

我有一個設計認證服務器正在運行,這是我將使用代碼爲了在成功登錄後重定向回用戶。是的,我知道Rails.env.production?但我試圖檢測的那個在單獨的Rails應用程序中運行。 –

+0

不知道你爲什麼要這樣的設置,但你總是可以將它設置爲「認證」環境。那麼你可以做Rails.env.authentication?得到你需要的東西。有一個單獨的應用程序運行設計認證的用例是什麼? – tyler

+0

因爲我工作的公司擁有多個域,每個域都有一個單獨的Rails應用程序。設計服務器用於單點登錄。感謝您的建議。我會盡力讓它工作。 –