2 Stimmen

Ist es möglich, die URL vor der Zuordnung von Routen vorzuverarbeiten?

Wir migrieren eine Website von einem proprietären Framework zu Ruby on Rails (v2.3). Das aktuelle Framework setzt manchmal ohne erkennbaren Grund /base/ an den Anfang der URL, und ich möchte, dass die bestehende URL funktioniert, auch wenn wir sie nicht mehr herausgeben werden.

Meine derzeitige Lösung, die mir nicht gefällt, besteht darin, die Routen einmal auf der Hauptkarte und einmal in einem "Basis"-Bereich zu definieren:

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

Was ich gerne machen würde, ist etwas wie:

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

  # do my routing here
end

Gibt es eine Lösung in dieser Form?

4voto

hellvinz Punkte 3402

Sie können eine Middleware schreiben, um die Base aus der Url zu entfernen. In 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

und fügen Sie diese Zeile in config/environment.rb ein

config.middleware.use "RemoveBase"

Ich habe es in 2.3.8 mit mongrel getestet, und es scheint zu funktionieren.

0voto

Yannis Punkte 5376

Ich denke, dass Sie einfach etwas wie folgt tun könnten:

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

Das sollte Sie zu dem richtigen Controller, der richtigen Aktion und der richtigen ID führen.

0 Stimmen

Ah - ich hätte sagen sollen, dass ich nicht die Standardrouten :controller/:action/:id verwende. Ich habe eine lange Liste von map.connect-Anweisungen, die ich nicht duplizieren wollen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X