Zgodnie z sugestią na pytanie Rails routing to handle multiple domains on single application, można użyć Rails Routing - Advanced Constraints, aby zbudować to, czego potrzebujesz.
Jeśli masz ograniczoną przestrzeń kontrolerów (z nieograniczonymi widokami wskazującymi na nich), to powinno działać. Po prostu utworzymy ograniczenie dla każdego kontrolera, który sprawdza, czy bieżący widok je dopasowuje.
Zakładając, że przestrzeń 2 kontrolerami (PostController i CommentController), można dodać następujące wpisy do routes.rb:
match "*path" => "post#show", :constraints => PostConstraint.new
match "*path" => "comment#show", :constraints => CommentConstraint.new
Następnie utwórz 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
Wreszcie utworzyć lib/comment_constraint.rb:
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
można zrobić kilka improv ementy, takie jak definiowanie klasy super-ograniczeń, która pobiera pamięć podręczną, więc nie musisz powtarzać kodu i nie ryzykujesz pobrania niewłaściwej nazwy klucza pamięci podręcznej w jednym z ograniczeń.
Sterownik nie musi być określony przez rekord bazy danych, chcę tylko w jakiś sposób ocenić, który kontroler ma być użyty dla danej trasy w Runtime, zamiast Designtime. –
Nadal nigdy nie znalazłem rozwiązania tego problemu, chociaż wydaje się, że jest to proste zadanie. Może aplikacja typu rack, która ponownie zapisuje adresy URL? –