是否可以在映射路由之前预处理URL?

时间:2010-10-07 08:13:37

标签: ruby-on-rails routing url-routing

我们正在将站点从专有框架迁移到Ruby on Rails(v2.3)。当前的框架有时会将/ base /放在URL的开头,没有明显的原因,我希望现有的URL能够正常工作,即使我们不再提供它。

我目前的解决方案,我不喜欢,是在主地图上定义路线一次,在“基础”范围内定义一次:

def draw_routes(map)
  # do my routing here
end

ActionController::Routing::Routes.draw do |map|
  map.with_options :path_prefix => '/base' do |base|
    draw_map(base)
  end

  draw_map(map)
end

我想做的是:

ActionController::Routing::Routes.draw do |map|
  map.strip 'base'

  # do my routing here
end

有那种形式的解决方案吗?

2 个答案:

答案 0 :(得分:3)

您可以编写中间件以从网址中删除基础。 在lib / remove_base.rb中:

class RemoveBase
  def initialize(app)
    @app = app
  end

  def call(env)
    env['REQUEST_PATH'].gsub!(/^\/base/, '')
    env['PATH_INFO'].gsub!(/^\/base/, '')
    env['REQUEST_URI'].gsub!(/^\/base/, '')
    @status, @headers, @response = @app.call(env)
    [@status, @headers, self]
  end

  def each(&block)
    @response.each(&block)
  end
end

并在config / environment.rb中添加此行

config.middleware.use "RemoveBase"

我在2.3.8中使用mongrel进行了测试,似乎有效。

答案 1 :(得分:0)

我认为你可以简单地做一些事情:

map.connect 'base/:controller/:action/:id'

那会把你引导到正确的控制器,动作和身份。