Sinatra: рдореЙрдбреНрдпреВрд▓рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЕрдЬреАрдм рд╡реНрдпрд╡рд╣рд╛рд░

рдХреЛ рдирд┐рд░реНрдорд┐рдд 1 рдЬрдире░ 2017  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: sinatra/sinatra

рдЪрд░рдг:

  1. рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ "рдПрд░рд░ 403 рдбреВ ... рдПрдВрдб" рдЬреЛрдбрд╝реЗрдВ, рдФрд░ рд░рд┐рдЯрд░реНрди {рдХреЛрдб: рд╕реНрдЯреЗрдЯрд╕, рдореИрд╕реЗрдЬ: рдмреЙрдбреА}
  2. AController рдореЗрдВ рд╣реЙрд▓реНрдЯ 403, 'a' рдЬреЛрдбрд╝реЗрдВ
  3. рдмреАрдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ рд╣реЙрд▓реНрдЯ 403, 'рдмреА' рдЬреЛрдбрд╝реЗрдВ
  4. CController рдореЗрдВ рд╣реЙрд▓реНрдЯ 403, 'c' рдЬреЛрдбрд╝реЗрдВ

  5. url '/a' рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдорд┐рд▓ рдЧрдпрд╛
    {"code":403,"message":["Oooooops, A"]}

  6. url рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ '/b/, рдорд┐рд▓ рдЧрдпрд╛
    {"code":403,"message":"{\"code\":403,\"message\":\"Oooooops, B\"}"}
  7. рдЕрдиреБрд░реЛрдз рдпреВрдЖрд░рдПрд▓ '/ рд╕реА' рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдорд┐рд▓ рдЧрдпрд╛
    {"code":403,"message":["{\"code\":403,\"message\":[\"{\\\"code\\\":403,\\\"message\\\":[\\\"Oooooops, C\\\"]}\"]}"]}

рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ, "Matryoshka рдЧреБрдбрд╝рд┐рдпрд╛" рдХреА рддрд░рд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреНрдпреЛрдВ?
рдХрд┐рддрдиреА рдмрд╛рд░ рдмреЙрдбреА рд░рд┐рдкреАрдЯ config.ru . рдореЗрдВ 'рдЙрдкрдпреЛрдЧ' рдСрд░реНрдбрд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ

рдпрд╣рд╛рдВ рдирдореВрдирд╛ рдХреЛрдб рд╣реИ, рдЗрд╕реЗ bundle install рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдПрдВ рдФрд░ рдлрд┐рд░ rackup -p 9192
sample_code.tar.gz

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЖрдкрдХрд╛ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЖрдк рдЕрдкрдиреЗ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдФрд░ рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╕реНрдЯреИрдХ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡рд╣ рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдХрд╛ рдХрд╛рд░рдг рдмрди рд░рд╣рд╛ рд╣реИред рдЖрдкрдХреЗ рд╕рднреА рдирд┐рдпрдВрддреНрд░рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрдВрдЯреНрд░реЛрд▓рд░ рд╕реЗ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рддреНрд░реБрдЯрд┐ 403 рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕ рд╡рд╛рд╕реНрддреБ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рдХреБрдЫ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреИрд╕реЗ рдЖрдк рдЗрд╕реЗ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЖрдк рдЕрдкрдиреЗ рдПрд░рд░-рд╣реИрдВрдбрд▓рд┐рдВрдЧ рд▓реЙрдЬрд┐рдХ рдХреЛ рдЕрдкрдиреЗ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдореЗрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ:

# test.ru
require 'json'
require 'sinatra/base'

class ErrorController < Sinatra::Base    
  error 403 do
    { code: status, message: body.join }.to_json
  end
end

class ApplicationController < Sinatra::Base    
  get '/' do
    'hello'
  end
end

class AController < ApplicationController
  get '/a' do
    halt 403, 'Oooooops, A'
  end
end

class BController < ApplicationController
  get '/b' do
    halt 403, 'Oooooops, B'
  end
end

class CController < ApplicationController
  get '/c' do
    halt 403, 'Oooooops, C'
  end
end

use ErrorController
use AController
use BController
use CController
run ApplicationController

рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдПрдХ рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╕реНрдЯреИрдХ рдХреЗ рдмрдЬрд╛рдп (рдпрд╛ рд╕рд╛рде рдореЗрдВ) рд░реИрдХ :: URLMap рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдЕрдкрдиреЗ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЛ рдирд╛рдорд╕реНрдерд╛рди рджреЗрдирд╛ рд╣реИ:

# test.ru
require 'json'
require 'sinatra/base'

class ApplicationController < Sinatra::Base    
  error 403 do
    { code: status, message: body.join }.to_json
  end

  get '/' do
    'hello'
  end
end

class AController < ApplicationController
  get '/' do
    halt 403, 'Oooooops, A'
  end
end

class BController < ApplicationController
  get '/' do
    halt 403, 'Oooooops, B'
  end
end

class CController < ApplicationController
  get '/' do
    halt 403, 'Oooooops, C'
  end
end

run Rack::URLMap.new(
  '/a' => AController,
  '/b' => BController,
  '/c' => CController,
  '/' => ApplicationController
)

рд╕рд┐рдирд╛рддреНрд░рд╛ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рд╣рд┐рдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдм рд░реВрдЯрд┐рдВрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд░реИрдХ рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИред

рдпреЗ рдмрд╕ рдХреБрдЫ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╢реБрд░реВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдореИрдВ рдЖрдкрдХреЛ рд░реВрдмреА рд╕реАрдЦрдирд╛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдФрд░ рд░реИрдХ рдХреЗ рджрд░реНрд╢рди рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рдЦреЛрджрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреВрдВрдЧрд╛ред рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реИ рдХрд┐ рд╕рд┐рдирд╛рддреНрд░рд╛ рд░реИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдПрдХ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдкрддрд▓реА рдбреАрдПрд╕рдПрд▓ рд╣реИ рдФрд░ рдмрд╣реБрдд рд░рд╛рдп рдирд╣реАрдВ рд╣реИред

рд╕рднреА 4 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЖрдк рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рддреАрди рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЛ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ: рд╕рдмрд╕реЗ рдЖрдВрддрд░рд┐рдХ рд░реИрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рджреВрд╕рд░реЗ рдЖрдВрддрд░рд┐рдХ-рд╕рдмрд╕реЗ рд░реИрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рднреЗрдЬрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реА рддрд░рд╣ рдЖрдЧреЗред рдЪреВрдВрдХрд┐ рд╕рднреА рдирд┐рдпрдВрддреНрд░рдХ рдПрдХ рд╣реА рддреНрд░реБрдЯрд┐-рд╣реИрдВрдбрд▓рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ рд╕рднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рддрд░реНрдХ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред

рдпрджрд┐ рдЖрдк рд╕рдордЭрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕реЗ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдЬрд╛рдирдиреЗ рдореЗрдВ рдЖрдкрдХреА рд╕рд╣рд╛рдпрддрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@mwpastore рд╢рд╛рдпрдж рдореИрдВрдиреЗ рдХреБрдЫ рдЧрд▓рдд рд╕рдордЭрд╛, рдореИрдВ рдмрд╕ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рддреНрд░реБрдЯрд┐ рдкреГрд╖реНрда рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

http://stackoverflow.com/questions/36127041/in-ruby-sinatra-how-to-halt-with-an-erb-template-and-error-message

рдЗрд╕ рд▓рд┐рдВрдХ рдореЗрдВ рдЙрддреНрддрд░ рд╕рд╣реА рддрд░реАрдХрд╛ рд╣реИ? рдореИрдВ рд░реВрдмреА рдореЗрдВ рдиреМрд╕рд┐рдЦрд┐рдпрд╛ рд╣реВрдБ ...

рдЖрдкрдХрд╛ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЖрдк рдЕрдкрдиреЗ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдФрд░ рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╕реНрдЯреИрдХ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡рд╣ рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдХрд╛ рдХрд╛рд░рдг рдмрди рд░рд╣рд╛ рд╣реИред рдЖрдкрдХреЗ рд╕рднреА рдирд┐рдпрдВрддреНрд░рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрдВрдЯреНрд░реЛрд▓рд░ рд╕реЗ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рддреНрд░реБрдЯрд┐ 403 рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕ рд╡рд╛рд╕реНрддреБ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рдХреБрдЫ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреИрд╕реЗ рдЖрдк рдЗрд╕реЗ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЖрдк рдЕрдкрдиреЗ рдПрд░рд░-рд╣реИрдВрдбрд▓рд┐рдВрдЧ рд▓реЙрдЬрд┐рдХ рдХреЛ рдЕрдкрдиреЗ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдореЗрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ:

# test.ru
require 'json'
require 'sinatra/base'

class ErrorController < Sinatra::Base    
  error 403 do
    { code: status, message: body.join }.to_json
  end
end

class ApplicationController < Sinatra::Base    
  get '/' do
    'hello'
  end
end

class AController < ApplicationController
  get '/a' do
    halt 403, 'Oooooops, A'
  end
end

class BController < ApplicationController
  get '/b' do
    halt 403, 'Oooooops, B'
  end
end

class CController < ApplicationController
  get '/c' do
    halt 403, 'Oooooops, C'
  end
end

use ErrorController
use AController
use BController
use CController
run ApplicationController

рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдПрдХ рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╕реНрдЯреИрдХ рдХреЗ рдмрдЬрд╛рдп (рдпрд╛ рд╕рд╛рде рдореЗрдВ) рд░реИрдХ :: URLMap рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдЕрдкрдиреЗ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЛ рдирд╛рдорд╕реНрдерд╛рди рджреЗрдирд╛ рд╣реИ:

# test.ru
require 'json'
require 'sinatra/base'

class ApplicationController < Sinatra::Base    
  error 403 do
    { code: status, message: body.join }.to_json
  end

  get '/' do
    'hello'
  end
end

class AController < ApplicationController
  get '/' do
    halt 403, 'Oooooops, A'
  end
end

class BController < ApplicationController
  get '/' do
    halt 403, 'Oooooops, B'
  end
end

class CController < ApplicationController
  get '/' do
    halt 403, 'Oooooops, C'
  end
end

run Rack::URLMap.new(
  '/a' => AController,
  '/b' => BController,
  '/c' => CController,
  '/' => ApplicationController
)

рд╕рд┐рдирд╛рддреНрд░рд╛ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рд╣рд┐рдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдм рд░реВрдЯрд┐рдВрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд░реИрдХ рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИред

рдпреЗ рдмрд╕ рдХреБрдЫ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╢реБрд░реВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдореИрдВ рдЖрдкрдХреЛ рд░реВрдмреА рд╕реАрдЦрдирд╛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдФрд░ рд░реИрдХ рдХреЗ рджрд░реНрд╢рди рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рдЦреЛрджрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреВрдВрдЧрд╛ред рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реИ рдХрд┐ рд╕рд┐рдирд╛рддреНрд░рд╛ рд░реИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдПрдХ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдкрддрд▓реА рдбреАрдПрд╕рдПрд▓ рд╣реИ рдФрд░ рдмрд╣реБрдд рд░рд╛рдп рдирд╣реАрдВ рд╣реИред

рдХреЛрдб рдФрд░ рд╕рд▓рд╛рд╣ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рд░реВрдмреА рдФрд░ рдЙрд╕рдХреЗ рджрд░реНрд╢рди рдХреЛ рдЧрд╣рд░рд╛рдИ рд╕реЗ рд╕реАрдЦрдирд╛ рдЬрд╛рд░реА рд░рдЦреВрдВрдЧрд╛ред

рдХреБрдЫ рдЦрдВрдбрд┐рдд рд╕рдордп рд╕реАрдЦрдиреЗ рдХреЗ рдмрд╛рдж рдпрд╣ рдореЗрд░реА рдкрд╣рд▓реА рд░реВрдмреА + рд╕рд┐рдирд╛рддреНрд░рд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рджреВрд╕рд░реА рднрд╛рд╖рд╛ рдореЗрдВ рдХреБрдЫ рдЕрдиреБрднрд╡ рднреВрд▓ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдмрд╕ рдЗрд╕реЗ 'рд░реВрдмреА рд╡реЗ' рдореЗрдВ рд╕реЛрдЪреЗрдВред

рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ: рдореЗрд░реА рдЦрд░рд╛рдм рдЕрдВрдЧреНрд░реЗрдЬреА рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ, рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕