是否可以在Sinatra中重写基本URL?

时间:2011-06-02 22:16:36

标签: ruby url sinatra rack base

是否可以重写基本网址?

E.g。而不是www.host.com/使用www.host.com/blah/ 一个基本网址,所以:

get '/' do
  ...
end

适用于www.host.com/blah/

我可以附加到我的所有路线'/blah/..'但是任何宝石等。 也不会起作用。

这可以在Rails中轻松完成,我也想在Sinatra中使用它。

3 个答案:

答案 0 :(得分:7)

我为这个rack-rewrite使用机架中间件,我很满意:)

    use Rack::Rewrite do
      rewrite %r{^/\w{2}/utils}, '/utils'
      rewrite %r{^/\w{2}/ctrl},  '/ctrl'
      rewrite %r{^/\w{2}/},      '/'
    end

编辑:

不确定我是否理解您的问题,但这里有一个config.ru文件

# encoding: utf-8
require './config/trst_conf'
require 'rack-flash'
require 'rack/rewrite'

use Rack::Session::Cookie, :secret => 'zsdgryst34kkufklfSwsqwess'
use Rack::Flash
use Rack::Rewrite do
  rewrite %r{^/\w{2}/auth},  '/auth'
  rewrite %r{^/\w{2}/utils}, '/utils'
  rewrite %r{^/\w{2}/srv},   '/srv'
  rewrite %r{^/\w{2}/},      '/'
end

map '/auth' do
  run TrstAuth.new
end
map '/utils' do
  run TrstUtils.new
end
map '/srv' do
  map '/tsk' do
     run TrstSysTsk.new
  end
  map '/' do
    run TrstSys.new
  end
end
map '/' do
  run TrstPub.new
end

和示例Sinatra :: Base子类

# encoding: utf-8

class TrstAuth < Sinatra::Base

  # Render stylesheets
  get '/stylesheets/:name.css' do
    content_type 'text/css', :charset => 'utf-8'
    sass :"stylesheets/#{params[:name]}", Compass.sass_engine_options
  end

  # Render login screen
  get '/login' do
    haml :"/trst_auth/login", :layout => request.xhr? ? false : :'layouts/trst_pub'
  end

  # Authentication
  post '/login' do
    if user = TrstUser.authenticate(params[:login_name], params[:password])
      session[:user] = user.id
      session[:tasks] = user.daily_tasks
      flash[:msg] = {:msg => {:txt => I18n.t('trst_auth.login_msg'), :class => "info"}}.to_json
      redirect "#{lang_path}/srv"
    else
      flash[:msg] = {:msg => {:txt => I18n.t('trst_auth.login_err'), :class => "error"}}.to_json
      redirect "#{lang_path}/"
    end
  end

  # Logout
  get '/logout' do
    session[:user] = nil
    session[:daily_tasks] = nil
    flash[:msg] = {:msg => {:txt => I18n.t('trst_auth.logout_msg'), :class => "info"}}.to_json
    redirect "#{lang_path}/"
  end

end

也许这会有帮助:) full source on github

答案 1 :(得分:2)

before块中,您可以修改env['PATH_INFO]`;然后,Sinatra将使用编辑后的值进行路由。

对于你的例子,像这样的东西可能有用......

before do
    env['PATH_INFO'].sub!(/^\/blah/, '')
end

我同意其他答案,使用中间件组件是一个更强大的解决方案,但如果你想要简洁明了的东西,那么里面的Sinatra app而不是config.ru,然后改变Rack环境也不错。

答案 2 :(得分:1)

您可以查看https://github.com/josh/rack-mount,也许可以帮助您解决问题?