Ruby 如何在Sinatra模块化应用程序中从模块路径重定向到根应用程序路径?

Ruby 如何在Sinatra模块化应用程序中从模块路径重定向到根应用程序路径?,ruby,module,sinatra,Ruby,Module,Sinatra,我有Sinatra base应用程序,如: class MyApp < Sinatra::Base get '/' do .. end get '/login' do .. end end 我在尝试访问/protected/list时遇到重定向循环,因为它试图从主应用重定向到/protected/login,而不是/login。 我怎样才能强迫它做正确的重定向?我知道我可以使用重定向到('../login'),但这似乎很糟糕。对于Sinatra,您只能将U

我有Sinatra base应用程序,如:

class MyApp < Sinatra::Base
  get '/' do
    ..
  end
  get '/login' do
    ..
  end
end
我在尝试访问
/protected/list
时遇到重定向循环,因为它试图从主应用重定向到/protected/login,而不是/login
我怎样才能强迫它做正确的重定向?我知道我可以使用
重定向到('../login')
,但这似乎很糟糕。

对于Sinatra,您只能将URL分配给常量,然后再引用它们

比如:

MAIN_URL='/'
受保护的\u URL='/PROTECTED'
类保护
够丑了

我建议改为使用

在路由方面以及在其他框架糟糕的地方,这是非常明智的


路由部分在这里:

来自/config/application.rb中的我的一个应用程序

class MyApp < Sinatra::Base

  configure do

    APP_ROOT = Pathname.new(File.expand_path('../../', __FILE__))
    # By default, Sinatra assumes that the root is the file that
    # calls the configure block.
    # Since this is not the case for us, we set it manually.
    set :root, APP_ROOT.to_path
    ...
classmyapp
您还可以在config.ru中定义该常量,就像这里的第一个答案一样

map "/" do
  run MyApp
end

map "/protected" do
  run Protected
end
MAIN_URL = '/'
PROTECTED_URL = '/protected'

class Protected < MyApp

before '/*' do
  redirect( MAIN_URL + 'login') unless logged_in
end

get '/list' do
  ...
end

map MAIN_URL do
  run MyApp
end

map PROTECTED_URL do
  run Protected
end
class MyApp < Sinatra::Base

  configure do

    APP_ROOT = Pathname.new(File.expand_path('../../', __FILE__))
    # By default, Sinatra assumes that the root is the file that
    # calls the configure block.
    # Since this is not the case for us, we set it manually.
    set :root, APP_ROOT.to_path
    ...