有没有办法在Ruby on Rails中的辅助方法中添加新路由?

时间:2015-09-11 05:07:44

标签: ruby-on-rails ruby

我有很多路线,需要很长时间才能启动应用。我想将路由添加到辅助方法并在需要时调用它。这可能吗?

我尝试将这样的内容添加到application_helper.rb文件中:

def add_new_routes
  Rails.application.routes.draw do
    get "/something" => "something#index"
  end
end

虽然这使得/ something路由工作,但它也使来自routes.rb的常规路由无法使用。有没有办法通过帮助文件正确添加路由,同时还保留原始路由?

1 个答案:

答案 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攻击(攻击者的乐趣,而不是你的乐趣),其中有人反复调用启用和禁用操作。