ruby-on-rails - 是否可以在映射路由之前对 URL 进行预处理?

标签 ruby-on-rails routes url-routing

我们正在将站点从专有框架迁移到 Ruby on Rails (v2.3)。当前的框架有时会无缘无故地将/base/放在 URL 的开头,我希望现有的 URL 能够工作,尽管我们不会再给出它。

我目前的解决方案(我不喜欢)是在主 map 上和“基本”范围上定义一次路线:

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

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

最佳答案

您可以编写一个中间件来从 url 中删除 base。 在 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 测试过它,它似乎可以工作。

关于ruby-on-rails - 是否可以在映射路由之前对 URL 进行预处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3879802/

相关文章:

ruby-on-rails - RoR - 第一个 App 项目,路由到主视图而不是/blog_entries

javascript - Angular UI Bootstrap 选项卡在路线​​更改时打开

asp.net-mvc - 用于搜索的 ASP.NET MVC 自定义路由

ruby-on-rails - 如何使用多个位置的ElasticSearch _geo_distance计算最近的位置

ruby-on-rails - Rails 重定向不工作?

ruby-on-rails - 你如何处理 Rails 2 路由中的错误格式?

javascript - 范围错误: Maximum call stack size exceeded (Angular)

用于参数化路由的 Next.js 子页面

ruby-on-rails - 从 json 对象列表创建列表列表 ruby

ruby-on-rails - Jira API - 添加附件