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