【发布时间】:2018-07-08 10:37:48
【问题描述】:
我们如何强制 Rails 在多个服务器/实例上重新加载路由?
我们在 Google App-Engine 中有一个多租户平台,在 5 个以上的实例上运行,我们希望我们的所有网站都从后端定义自己的一组路由。每当我们有一个新站点时,我们当前必须重新启动所有服务器才能访问新路由。
我们遵循了这个guide,但它只适用于本地环境,并且不会在生产中的所有服务器上更新路由而不重新启动服务器。
我们的路由文件如下所示:
routes.rb
Frontend::Application.routes.draw do
root 'home#index'
...
DynamicRoutes.load
end
lib/dynamic_routes.rb
def self.load
Frontend::Application.routes.draw do
Site.all.each do |site|
site.routes.each do |custom_route|
route_name = custom_route[0]
route = custom_route[1]
# write the route with the host constraint
self.constraints(:host => site.hostname) do
case route_name
when :contact_form
mapper.match "#{route}", to: 'contact_forms#new' as: "contact_#{site.id}"
end
...
end
end
end
end
end
def self.reload
Frontend::Application.reload_routes!
end
每次更新路线或创建新站点后,我们都会运行DynamicRoutes::reload
【问题讨论】:
-
您是否尝试在
Site模型的after_save回调中添加DynamicRoutes::reload? -
是的,我已经试过了。多次保存站点和路线也不能确保重新加载的路线
-
@Mik 使用
Frontend::Application.routes_reloader.reload!重新加载路由的方法 -
@VishalJAIN
Frontend::Application.reload_routes!是该方法的别名
标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 routing