2011-02-15 139 views
3

这是我知道的一个奇怪的。我试图将两个Rails应用程序,v3和v2.3.5绑定在一起。我希望它们共享相同的域,并且为了在不更改旧应用程序中的URL的情况下执行此操作,我正在尝试找到一种方法来覆盖Rails路由器。覆盖Rails路由器

我希望新的应用程序住在域的根,并在几个目录前辈之一。例如:

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

所以,既然APP1住在根和我使用的是乘客,我只需要创建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根据我目前使用的前缀。

所以,我需要从链接中删除该前缀,所以只有旧的网址工作。

我需要做到这一点,以释放新的应用程序。到时候我会把旧版本升级到v3并直接处理这个问题,但现在任何黑客都可以正常工作。

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

回答

1

原来这只是在ApplicationHelper像这样覆盖url_for是很容易:

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 

但是,这导致了应用程序中的间歇性错误,我无法查明。我想这是因为性能受到打击。

所以最后我被迫使用不同的域较新的应用程序。

0

我真的不知道这是可以使用2个不同版本的轨道上你的路线,而是另辟蹊径做的是使用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 mydomain.com的记录您的IP的haproxy并点employees.mydomain.com到mydomain.com/employees。

为了测试它,你可以mydomain.com添加HAProxy的服务器的IP地址和你的/ etc/hosts文件

+0

这是可能的,因为我已经完成了。我知道我的例子和解释是有点人为的,但它确实有效。唯一的问题是生成的链接。我想我已经找到了一个解决方案,我将在测试后立即发布。尽管如此,感谢您的意见! – Ivan 2011-02-15 17:28:30