Ruby on rails RoR 3、乘客、相对url和帮助器方法,如根url

Ruby on rails RoR 3、乘客、相对url和帮助器方法,如根url,ruby-on-rails,apache,passenger,mod-rails,Ruby On Rails,Apache,Passenger,Mod Rails,我真的很难理解Rails 3应用程序的路由行为,因为它与乘客和路由助手方法有关。下面是一个快速概述: 当用户注册我的站点时,我想做的一件事就是发送一封验证电子邮件,以确保用户提交了一个有效的电子邮件地址。因此,我设置了mailer,向用户发送一个带有某种神奇令牌的URL,从而证明他们已经收到了我发送的电子邮件。电子邮件正文中的URL是通过路由助手方法生成的(在本例中为verify\u URL(“a1b2c3”)),URL被适当地填充到电子邮件中,如下所示: http://localhost:30

我真的很难理解Rails 3应用程序的路由行为,因为它与乘客和路由助手方法有关。下面是一个快速概述:

当用户注册我的站点时,我想做的一件事就是发送一封验证电子邮件,以确保用户提交了一个有效的电子邮件地址。因此,我设置了mailer,向用户发送一个带有某种神奇令牌的URL,从而证明他们已经收到了我发送的电子邮件。电子邮件正文中的URL是通过路由助手方法生成的(在本例中为
verify\u URL(“a1b2c3”)
),URL被适当地填充到电子邮件中,如下所示:

http://localhost:3000/verify/a1b2c3
这一切在
localhost:3000
下都能正常工作。因此,像一个负责任的开发人员一样,我要做的下一件事就是将我的应用程序移动到我的远程QA环境中,并验证一切是否正常。我的托管提供商使用Passenger,我已将其设置为可以访问我的QA环境,如下所示:

http://my.url/qa
http://my.url/qa/qa/verify/a1b2c3
这是通过在相应的
.htaccess
文件中将RailsBaseURI设置为
/qa
完成的。因此,我试图在我的QA环境中注册该站点,我希望helper方法
verify\u url
生成以下url:

http://my.url/qa/verify/a1b2c3
然而,我得到的却是:

http://my.url/verify/a1b2c3
注意到明显缺少对“qa”路径的引用吗?我浏览了各种博客和手册,寻找答案,我看到了以下建议:

  • 设置环境变量,例如
    ENV['RAILS\u RELATIVE\u URL\u ROOT']
  • 在my
    environment/qa.rb中设置
    ActionController::Base.relative\u url\u root
  • 将映射添加到my
    config.ru
    以在特定路径下初始化我的应用程序
  • 将我的路线包装在一个范围内
但是,这些选项中的每一个似乎都不推荐使用(前两个选项),或者最终生成冗余路径信息(后两个选项),如下所示:

http://my.url/qa
http://my.url/qa/qa/verify/a1b2c3
有人能告诉我正确的设置方法吗?这样,当我调用
verify_url(“a1b2c3”)
时,我实际上得到了正确的url,包括我的QA环境的相对路径?理想情况下,我希望能够以某种方式在
environments/qa.rb
中进行设置,这样,在从一个环境移动到下一个环境时,我根本不需要更改我的应用程序


提前谢谢

我会取消整个
/qa/
并将暂存移动到类似
http://qa.my.url/
否则,您必须对代码进行更改,这可能会对生产造成负面影响

更新

我忽略了你想在电子邮件中使用这些路由的事实。在这种情况下,您必须在url帮助器中设置
:host

verify_url(:id=>"a1b2c3", :host=>"qa.my.url")
为了减少投入生产后必须进行的更改量,我建议您在初始值设定项中定义一个常量(在
/path/To/app/config/initializers/my_host.rb
中):

之后,您可以在电子邮件模板中调用
验证url
,如下所示:

verify_url(:id=>"a1b2c3", :host=>MY_HOST)
一旦投入生产,更改
MY_HOST
常量,您就不必担心模板了


在我看来,我从不使用
*\uURL
帮助程序,只使用
*\u路径
帮助程序来避免这个问题。

在花了一点时间处理ActionMailer文档之后,发现有一个更简单的解决方案,至少对于我希望完成的任务。Wukerplank肯定回答了我的问题,但似乎我问的问题不太正确。:-)

我唯一真正需要看到完全限定URL的时候是在邮件程序中工作时,对吗?否则,路径就可以正常工作。事实证明,ActionMailer允许您在每个环境的基础上指定默认url选项。在我的
environments/development.rb
config文件中,我现在有以下内容:

config.action\u mailer.default\u url\u options={:host=>localhost:3000}

当我移动到我的QA环境时,我只需要告诉乘客我是从QA运行的,并且有如下内容
environments/QA.rb
config:

config.action\u mailer.default\u url\u options={:host=>qa.my.url}


这样,代码就不必在不同的环境之间进行任何更改,因此,我真的不在乎我在哪个域、子域或端口上运行。。。它只是工作。希望这对将来的其他人有所帮助。谢谢

另外,我应该补充一点,我对Rails非常陌生。。。所以,如果有什么明显的地方我遗漏了或者有其他的方法,请告诉我。实际上,我应该提到这一点,但我的初衷是使用子域。然而,我很早就放弃了这种方法,因为我遇到了同样的问题。在子域(如
qa
)下运行时,使用路由助手(如
verify\u url
)仍会生成
http://my.url/verify/a1b2c3
而不是所需的
http://qa.my.url/verify/a1b2c3
。有没有办法让Rails的助手方法知道它是在子域下运行的?啊,我明白了。朴素典雅。我没有使用
*\uURL
帮助程序就手工制作了类似的东西,但感觉不太像“rails方式”。这感觉好多了。此外,现在我想起来了,我唯一真正需要的
*\uURL
帮助程序(与
*\u路径
帮助程序相反)是在mailers中,所以这对我来说非常有用。谢谢