2013-03-20 39 views
0

我们正在更新我们的大型Web应用程序并摆脱我们的URL同义词系统。例如,虽然我们只为“广告客户”使用一种模型,但它使用同义词路径代替“商人”和“卖家”。因此,/ merchant/1和/ seller/1使用与广告商/ 1相同的确切控制器和操作。Rails 3路径中的递归重定向

我们不再需要此功能,但我们确实需要使用旧URL来正确地将用户重定向到适当的位置(即适当的控制器操作)。

到目前为止,我已经试过:

1)阅读http://guides.rubyonrails.org/routing.html - 这使我尝试以下建议

2)匹配 '/商人'=>重定向('/广告主) - 这似乎并没有工作,尽管语法似乎是正确的。

3)循环访问资源(这会产生路由的TON并可能导致不安全感):

ADVERTISER_SYNONOYMS = ['affiliates', 'sellers'] 

ADVERTISER_SYNONYMS.each do |a| 
    resources :advertisers, :path => a, :as => :advertiser 
    resources :other_controller do 
     member do 
     get :test 
     match :generate_test 
     end 
    end 
    end 
end 

我们使用嵌套资源在我们的routes.rb,所以我用得到这些synonymns费周折在更复杂的URL中都可以识别。如果有人处理这个问题或者有更优雅的建议,我会非常感激。

回答

0

有很多方法可以处理这个问题,其中包括routes.rb中的其他路由,或者像Apache或Nginx一样在Webserver级别重写。

我喜欢的一个解决方案是rack-rewrite宝石;它保持路线清洁,规则是纯红宝石。它提供了一组配置重写和重定向的方法。对于你的情况,我想使用永久重定向。虽然我没有自己测试过,但是下面的东西可能适合你:

# Gemfile 
gem 'rack-rewrite' 

# application.rb 
config.middleware.use(Rack::Rewrite) do 
    r301 %r{/merchant|seller/(\w+)}, '/advertiser/$1' 
end