Можно ли переписать базовый URL в Синатре? - PullRequest
6 голосов
/ 03 июня 2011

Можно ли переписать базовый URL?

например. вместо www.host.com/ использовать www.host.com/blah/ в качестве базовый URL и так:

get '/' do
  ...
end

будет работать для www.host.com/blah/

Я могу добавить ко всем своим маршрутам '/blah/..', но любые драгоценные камни и т. Д. не сможет работать, а также.

Это можно легко сделать в Rails, и я бы хотел, чтобы это тоже было в Синатре.

Ответы [ 3 ]

7 голосов
/ 03 июня 2011

Я использую промежуточное программное обеспечение стойки для этого перезапись стойки , и я вполне доволен им:)

    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

может быть, это поможет :) полный исходный код на github .

2 голосов
/ 28 января 2014

В блоке before вы можете редактировать env['PATH_INFO] `;Затем Синатра будет использовать отредактированное значение для маршрутизации.

Для вашего примера что-то подобное может сработать ...

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

Я согласен с другими ответами, что использование компонента промежуточного программного обеспечения являетсяболее надежное решение, но если вам нужно что-то лаконичное и простое, которое работает внутри приложения Sinatra вместо config.ru, тогда использование среды Rack неплохо.

1 голос
/ 03 июня 2011

Вы могли бы взглянуть на https://github.com/josh/rack-mount, может быть, кто-то может вам помочь?

...