Можно ли предварительно обработать URL перед сопоставлением маршрутов? - PullRequest
1 голос
/ 07 октября 2010

Мы переносим сайт с проприетарного фреймворка на 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 ]

3 голосов
/ 07 октября 2010

Вы можете написать промежуточное программное обеспечение для удаления базы из URL.В 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, и похожена работу.

0 голосов
/ 07 октября 2010

Я думаю, что вы могли бы просто сделать что-то вроде:

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

Это должно направить вас к нужному контроллеру, действию и идентификатору.

...