基于请求域的sinatra动态路由

时间:2014-01-02 19:31:01

标签: ruby sinatra

假设我有一个模块化的Sinatra应用程序用于一百个站点,我需要有条件地拉入路由 - 如果request.host是example.com,那么我想在文件{{1}中注册路由 - 但是如果request.host是example_routes.rb,那么我想完全注册另一组路由,完全忽略第一个文件。

也有人可能会说应用程序试图做太多事情,但为了讨论,我想听听一些想法和方法。

不幸的是,当请求对象通过时(注册新路由需要),似乎无法再注册该路由。这是我的问题的本质。

1 个答案:

答案 0 :(得分:3)

正如您所注意到的,您无法根据请求定义路由,因为它们都是在第一个请求进入之前在启动时设置的。

实现目标的一种方法是使用:host_name condition

get 'a_route', :host_name => 'example.com' do
  # this route will only apply to requests to example.com
end

get 'a_route', :host_name => 'other_example.com' do
  # this route will only apply to requests to other_example.com
end

如果需要,它们可以位于不同的文件中,并且它们不会相互覆盖,因此您可以在启动时调用它们,并且请求将路由到相应的代码。开发和测试可能很棘手,您可能需要以某种方式在本地访问所有路由。