在Rails 3路由中递归重定向

时间:2013-03-20 23:31:46

标签: ruby-on-rails ruby-on-rails-3 routes aliases

我们正在更新我们的大型网络应用程序并摆脱我们的URL同义词系统。例如,虽然我们只使用一个模型作为“广告客户”,但使用同义路径将其替换为“商家”和“卖家”。因此,/ merchant / 1和/ seller / 1使用与广告商/ 1相同的控制器和操作。

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

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

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

2)匹配'/ merchants'=>重定向('/ advertisers') - 这似乎根本不起作用,尽管语法似乎是正确的。

3)迭代资源(这会产生一系列路线并可能导致不安全感):

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中使用嵌套资源,所以我很难让这些同义词在更复杂的URL中得到识别。如果有人处理这个问题或有更优雅的建议,我将非常感激。

1 个答案:

答案 0 :(得分:0)

有很多方法可以解决这个问题,包括你尝试过的routes.rb中的其他路由,或者在Apache或Nginx等网络服务器级别重写。

我喜欢的一个解决方案是rack-rewrite宝石;它保持路线清洁,规则是纯粹的红宝石。它提供了一组配置重写和重定向的方法。根据您的情况,我想使用永久重定向。虽然我自己没有测试过,但以下内容对您有用:

# Gemfile
gem 'rack-rewrite'

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