2013-07-21 47 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应用程序。设计服务器用于单点登录。感谢您的建议。我会尽力让它工作。 –