我有很多路线,需要很长时间才能启动应用。我想将路由添加到辅助方法并在需要时调用它。这可能吗?
我尝试将这样的内容添加到application_helper.rb文件中:
def add_new_routes
Rails.application.routes.draw do
get "/something" => "something#index"
end
end
虽然这使得/ something路由工作,但它也使来自routes.rb的常规路由无法使用。有没有办法通过帮助文件正确添加路由,同时还保留原始路由?
答案 0 :(得分:2)
是的,这肯定是可能的,但请为了上帝的爱,请阅读关于问题不是你的路线的所有评论。
使用此技术,当您删除(禁用)路由集时,必须重新加载所有路由。
将此粘贴在应用程序启动时将加载的位置。
class DynamicallyCreatedRouteset
def self.load
self.create_routes! if @routeset_enabled
end
def self.enable!
return true if @routeset_enabled
@routeset_enabled = true
self.load
end
def self.disable!
return false unless @routeset_enabled
@routeset_enabled = false
self.reload_routes!
end
def self.reload_routes!
RailsAppName::Application.routes_reloader.reload!
end
def self.create_routes!
# a class derives this and implements their own
raise NotImplementedError
end
end
class MyRouteSet < DynamicallyCreatedRouteset
def self.create_routes!
RailsAppName::Application.routes.draw do
get '/someroute'
post '/etc....'
end
end
end
class MyOtherRouteSet < DynamicallyCreatedRouteset
def self.create_routes!
RailsAppName::Application.routes.draw do
get '/anotherroute'
post '/etc....'
end
end
end
在您的config / routes.rb中,位于RailsAppName::Application.routes.draw
块
# Have load for every custom routeset you defined.
MyRouteSet.load
MyOtherRouteSet.load
在routes.draw
块之外,您可以将MyRouteSet.enable!
放入应在启动时启用的动态启用路由。
并在帮手
def my_route_helper
MyRouteSet.enable!
end
def disable_my_route_set
MyRouteSet.disable!
end
def my_other_route_helper
MyOtherRouteSet.enable!
end
# etc....
请注意,默认情况下将禁用所有动态启用的路由,因为@routeset_enabled
将为nil。如果您希望默认情况下启用某些路线,则需要在MyRouteSet.enable!
之后致电routes.draw
。
另请注意,当禁用路由集时,此技术将具有重新加载整个路由表的相同效果,在某些情况下,当重新绘制整个路由表时,实际上可能会使您的应用程序速度过慢。例如,如果禁用帮助程序作为控制器操作的一部分被调用,并且如果您的路由确实很慢,则可能会导致连接超时等。或者它可以导致有趣的DoS攻击(攻击者的乐趣,而不是你的乐趣),其中有人反复调用启用和禁用操作。