Como se sugirió en la pregunta Rails routing to handle multiple domains on single application, supongo que podría usar Rails Routing - Advanced Constraints para construir lo que necesita.
Si tiene un espacio limitado de controladores (con vistas ilimitadas apuntando hacia ellos), esto debería funcionar. Simplemente cree una restricción para cada controlador que verifique si la vista actual los combina.
Asumiendo que tiene un espacio de 2 controladores (PostController y CommentController), se podría añadir lo siguiente a su routes.rb:
match "*path" => "post#show", :constraints => PostConstraint.new
match "*path" => "comment#show", :constraints => CommentConstraint.new
A continuación, cree 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
Por último, cree 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
Usted puede hacer algo de improvisación como, por ejemplo, definir una clase de superconstricción que recupera el caché, por lo que no tiene que repetir el código y no corre el riesgo de obtener un nombre de clave de caché erróneo en una de las restricciones.
El controlador no necesita ser determinado por un registro de base de datos, solo quiero una forma de evaluar qué controlador usar para una ruta dada en Runtime, en lugar de Designtime. –
Todavía nunca encontré una solución a esto, aunque parece una tarea simple. ¿Tal vez una aplicación en rack que vuelve a escribir las URL? –