【问题标题】:Is it possible to preprocess the URL before mapping routes?是否可以在映射路由之前对 URL 进行预处理?
【发布时间】:2010-10-07 08:13:36
【问题描述】:

我们正在将一个网站从专有框架迁移到 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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我认为您可以简单地执行以下操作:

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

      这应该将您路由到正确的控制器、操作和 ID。

      【讨论】:

      • 啊 - 应该说,我没有使用标准的 :controller/:action/:id 路由。我有一长串不想重复的 map.connect 语句。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-10
      • 2011-02-07
      • 2017-01-05
      • 2017-04-06
      相关资源
      最近更新 更多