覆盖Rails路由器

时间:2011-02-15 17:05:42

标签: ruby-on-rails

我知道这是一个奇怪的事。我正在尝试将两个Rails应用程序,一个v3和一个v2.3.5

联系在一起

我希望他们共享同一个域,为了在不更改旧应用程序中的URL的情况下这样做,我正试图找到一种方法来覆盖Rails路由器。

我希望较新的应用程序位于域的根目录,而较旧的应用程序位于多个目录下。例如:

/          => app1 # v3
/users     => app1
/employees => app2 # v2.3.5
/payrolls  => app2

所以,既然app1生活在root用户并且我正在使用Passenger,我只需要在app1的public文件夹中创建符号链接到app2的公共文​​件夹,如下所示:

app1/public/employees => app2/public
app1/public/payrolls  => app2/public

然后我将RailsBaseURI /employeesRailsBaseURI /payrolls添加到Apache的配置中。

有了这个,我可以使app2的旧URL工作,但在应用程序内,链接指向前缀。例如,/employees/1/employees/employees/1/payrolls/employees/1都有效,但应用中的链接指向/employees/employees/1/payrolls/employees/1,具体取决于我当前使用的前缀

因此,我需要从链接中删除该前缀,以便只使用旧URL。

我需要这样做才能发布更新的应用。我及时将旧版本升级到v3并直接解决此问题,但现在任何黑客攻击都可以使其正常工作。

我不指望一个解决方案,但是如果你能指出我在Rails源代码的正确方向,或者我可能没有看到更简单的方法,我将非常感激。

2 个答案:

答案 0 :(得分:1)

通过覆盖url_for中的ApplicationHelper就可以了,这很简单:

def url_for(options = {})
  original = super(options)
  # I tried this in order to improve performance:
  return original unless original.starts_with?('/employees/employees')
  original.gsub('/employees/employees', '/employees')
end

然而,这导致应用程序中的间歇性错误,我无法确定。我想这是因为性能受到了影响。

所以最后我不得不为不同的应用程序使用不同的域名。

答案 1 :(得分:0)

我不确定你的路线上是否可以使用2个不同版本的rails,但另一种方法是使用haproxy和2个不同的服务器。

# In haproxy.conf:

  frontend rails
    bind *:80
    acl rails2 hdr_host(end) -i employees.mydomain.com
    acl rails3 hdr_host(end) -i mydomain.com
    use_backend rails2_server if rails2
    use_backend rails3_server if rails3
    default_backend rails3_server

  backend rails2_server
    server myrails2_server 192.168.1.1:3000 check

  backend rails3_server
    server myrails3_server 192.168.1.1:3001 check

然后将您的DNS A记录mydomain.com指向您的haproxy IP并将employees.mydomain.com指向mydomain.com/employees。

要测试它,您可以将haproxy服务器和mydomain.com的IP地址添加到/ etc / hosts文件