Wie in der Frage Rails routing to handle multiple domains on single application vorgeschlagen, ich denke, Sie könnten Rails Routing - Advanced Constraints verwenden, um zu bauen, was Sie brauchen.
Wenn Sie einen begrenzten Bereich von Controllern haben (mit unbegrenzten Ansichten auf sie zeigen), sollte dies funktionieren. Erstellen Sie einfach eine Einschränkung für jeden Controller, der überprüft, ob die aktuelle Ansicht ihnen entspricht.
Vorausgesetzt, dass Sie einen Raum von 2 Controller haben (Postcontroller und Comment), könnten Sie Folgendes zu Ihrer routes.rb hinzufügen:
match "*path" => "post#show", :constraints => PostConstraint.new
match "*path" => "comment#show", :constraints => CommentConstraint.new
Dann erstellen lib/post_constraint.rb:
class PostConstraint
def matches?(request)
'post' == Rails.cache.fetch("/view_controller_map/#{request.params[:view_name]}") { View.find_by_name(request.params[:view_name]).controller }
end
end
Schließlich lib/comment_constraint.rb erstellen:
class CommentConstraint
def matches?(request)
'comment' == Rails.cache.fetch("/view_controller_map/#{request.params[:view_name]}") { View.find_by_name(request.params[:view_name]).controller }
end
end
Sie etwas Improvisations tun können B. das Definieren einer Super-Constraint-Klasse, die den Cache abruft, sodass Sie den Code nicht wiederholen müssen und nicht riskieren, einen falschen Cache-Schlüsselnamen in einem der Constraints abzurufen.
Der Controller muss nicht durch einen Datenbankeintrag bestimmt werden. Ich möchte nur einen Weg finden, um zu bestimmen, welcher Controller für eine bestimmte Route zur Laufzeit anstelle von Designtime verwendet werden soll. –
Noch nie eine Lösung gefunden, obwohl es wie eine einfache Aufgabe scheint. Vielleicht eine Rack-Anwendung, die URLs neu schreibt? –