рдЪрд░рдг:
CController рдореЗрдВ рд╣реЙрд▓реНрдЯ 403, 'c' рдЬреЛрдбрд╝реЗрдВ
url '/a' рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдорд┐рд▓ рдЧрдпрд╛
{"code":403,"message":["Oooooops, A"]}
{"code":403,"message":"{\"code\":403,\"message\":\"Oooooops, B\"}"}
{"code":403,"message":["{\"code\":403,\"message\":[\"{\\\"code\\\":403,\\\"message\\\":[\\\"Oooooops, C\\\"]}\"]}"]}
рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ, "Matryoshka рдЧреБрдбрд╝рд┐рдпрд╛" рдХреА рддрд░рд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреНрдпреЛрдВ?
рдХрд┐рддрдиреА рдмрд╛рд░ рдмреЙрдбреА рд░рд┐рдкреАрдЯ config.ru
. рдореЗрдВ 'рдЙрдкрдпреЛрдЧ' рдСрд░реНрдбрд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ
рдпрд╣рд╛рдВ рдирдореВрдирд╛ рдХреЛрдб рд╣реИ, рдЗрд╕реЗ bundle install
рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдПрдВ рдФрд░ рдлрд┐рд░ rackup -p 9192
sample_code.tar.gz
рдЖрдк рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рддреАрди рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЛ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ: рд╕рдмрд╕реЗ рдЖрдВрддрд░рд┐рдХ рд░реИрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рджреВрд╕рд░реЗ рдЖрдВрддрд░рд┐рдХ-рд╕рдмрд╕реЗ рд░реИрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рднреЗрдЬрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реА рддрд░рд╣ рдЖрдЧреЗред рдЪреВрдВрдХрд┐ рд╕рднреА рдирд┐рдпрдВрддреНрд░рдХ рдПрдХ рд╣реА рддреНрд░реБрдЯрд┐-рд╣реИрдВрдбрд▓рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ рд╕рднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рддрд░реНрдХ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред
рдпрджрд┐ рдЖрдк рд╕рдордЭрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕реЗ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдЬрд╛рдирдиреЗ рдореЗрдВ рдЖрдкрдХреА рд╕рд╣рд╛рдпрддрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
@mwpastore рд╢рд╛рдпрдж рдореИрдВрдиреЗ рдХреБрдЫ рдЧрд▓рдд рд╕рдордЭрд╛, рдореИрдВ рдмрд╕ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рддреНрд░реБрдЯрд┐ рдкреГрд╖реНрда рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдЗрд╕ рд▓рд┐рдВрдХ рдореЗрдВ рдЙрддреНрддрд░ рд╕рд╣реА рддрд░реАрдХрд╛ рд╣реИ? рдореИрдВ рд░реВрдмреА рдореЗрдВ рдиреМрд╕рд┐рдЦрд┐рдпрд╛ рд╣реВрдБ ...
рдЖрдкрдХрд╛ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЖрдк рдЕрдкрдиреЗ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдФрд░ рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╕реНрдЯреИрдХ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡рд╣ рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдХрд╛ рдХрд╛рд░рдг рдмрди рд░рд╣рд╛ рд╣реИред рдЖрдкрдХреЗ рд╕рднреА рдирд┐рдпрдВрддреНрд░рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрдВрдЯреНрд░реЛрд▓рд░ рд╕реЗ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рддреНрд░реБрдЯрд┐ 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
)
рд╕рд┐рдирд╛рддреНрд░рд╛ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рд╣рд┐рдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдм рд░реВрдЯрд┐рдВрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд░реИрдХ рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИред
рдпреЗ рдмрд╕ рдХреБрдЫ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╢реБрд░реВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдореИрдВ рдЖрдкрдХреЛ рд░реВрдмреА рд╕реАрдЦрдирд╛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдФрд░ рд░реИрдХ рдХреЗ рджрд░реНрд╢рди рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рдЦреЛрджрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреВрдВрдЧрд╛ред рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реИ рдХрд┐ рд╕рд┐рдирд╛рддреНрд░рд╛ рд░реИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдПрдХ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдкрддрд▓реА рдбреАрдПрд╕рдПрд▓ рд╣реИ рдФрд░ рдмрд╣реБрдд рд░рд╛рдп рдирд╣реАрдВ рд╣реИред
рдХреЛрдб рдФрд░ рд╕рд▓рд╛рд╣ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рд░реВрдмреА рдФрд░ рдЙрд╕рдХреЗ рджрд░реНрд╢рди рдХреЛ рдЧрд╣рд░рд╛рдИ рд╕реЗ рд╕реАрдЦрдирд╛ рдЬрд╛рд░реА рд░рдЦреВрдВрдЧрд╛ред
рдХреБрдЫ рдЦрдВрдбрд┐рдд рд╕рдордп рд╕реАрдЦрдиреЗ рдХреЗ рдмрд╛рдж рдпрд╣ рдореЗрд░реА рдкрд╣рд▓реА рд░реВрдмреА + рд╕рд┐рдирд╛рддреНрд░рд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рджреВрд╕рд░реА рднрд╛рд╖рд╛ рдореЗрдВ рдХреБрдЫ рдЕрдиреБрднрд╡ рднреВрд▓ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдмрд╕ рдЗрд╕реЗ 'рд░реВрдмреА рд╡реЗ' рдореЗрдВ рд╕реЛрдЪреЗрдВред
рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ: рдореЗрд░реА рдЦрд░рд╛рдм рдЕрдВрдЧреНрд░реЗрдЬреА рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ, рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдЖрдкрдХрд╛ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЖрдк рдЕрдкрдиреЗ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдФрд░ рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╕реНрдЯреИрдХ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡рд╣ рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдХрд╛ рдХрд╛рд░рдг рдмрди рд░рд╣рд╛ рд╣реИред рдЖрдкрдХреЗ рд╕рднреА рдирд┐рдпрдВрддреНрд░рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрдВрдЯреНрд░реЛрд▓рд░ рд╕реЗ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рддреНрд░реБрдЯрд┐ 403 рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕ рд╡рд╛рд╕реНрддреБ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рдХреБрдЫ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреИрд╕реЗ рдЖрдк рдЗрд╕реЗ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЖрдк рдЕрдкрдиреЗ рдПрд░рд░-рд╣реИрдВрдбрд▓рд┐рдВрдЧ рд▓реЙрдЬрд┐рдХ рдХреЛ рдЕрдкрдиреЗ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдореЗрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ:
рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдПрдХ рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╕реНрдЯреИрдХ рдХреЗ рдмрдЬрд╛рдп (рдпрд╛ рд╕рд╛рде рдореЗрдВ) рд░реИрдХ :: URLMap рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдЕрдкрдиреЗ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЛ рдирд╛рдорд╕реНрдерд╛рди рджреЗрдирд╛ рд╣реИ:
рд╕рд┐рдирд╛рддреНрд░рд╛ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рд╣рд┐рдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдм рд░реВрдЯрд┐рдВрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд░реИрдХ рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИред
рдпреЗ рдмрд╕ рдХреБрдЫ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╢реБрд░реВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдореИрдВ рдЖрдкрдХреЛ рд░реВрдмреА рд╕реАрдЦрдирд╛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдФрд░ рд░реИрдХ рдХреЗ рджрд░реНрд╢рди рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рдЦреЛрджрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреВрдВрдЧрд╛ред рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реИ рдХрд┐ рд╕рд┐рдирд╛рддреНрд░рд╛ рд░реИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдПрдХ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдкрддрд▓реА рдбреАрдПрд╕рдПрд▓ рд╣реИ рдФрд░ рдмрд╣реБрдд рд░рд╛рдп рдирд╣реАрдВ рд╣реИред