Почему параметры больше не содержат именованные параметры в BetterError? - PullRequest
0 голосов
/ 06 октября 2018

Я не уверен, было ли что-то, что изменилось в Синатре или одном из драгоценных камней, но когда я пытаюсь проверить параметры на маршруте с именованными параметрами, он выходит пустым.Это проблема с BetterErrors или с чем-то еще?

Чтобы уточнить, вот код:

class SiteApp < App  

  get '/test/:id' do
    abort asdfasdf
    "Hello ID: #{params[:id]}"
  end

end

Затем я указываю свой браузер на / test / 1234, который запускает BetterError.Я ожидаю, что params будет иметь идентификатор 1234, но вместо этого он пуст, он содержит только «захваты» (это еще один вопрос, поскольку я даже не уверен, откуда это и почему).

BetterError params empty

Но, как ни странно, вместо того, чтобы делать 'abort', если я делаю 'abort asdfasdf', теперь отображаются параметры, которые я хочу увидеть.

BetterError shows params now

До сих пор у меня все работало нормально, просто делал 'abort', чтобы проверить параметры.Но теперь мне нужно добавить несколько случайных символов после прерывания, чтобы получить правильные параметры.

Вот полный скринкаст .

Вопрос в том, это проблема с Синатрой?Или Мустерманн?Или BetterErrors?

1 Ответ

0 голосов
/ 09 октября 2018

Не используйте abort для этой цели, поскольку имеет непредсказуемый побочный эффект.Используйте raise вместо этого.Причина в том, что abort завершит процесс и отправит указанную вами строку в STDERR.Это может быть полезно в простых сценариях с одним процессом, но его следует избегать в приложениях, на серверах, во всем, где многопоточность может быть проблемой.Это не было предназначено для этой цели.Кроме того, если вы хотите увидеть, что происходит внутри вашего кода, я настоятельно рекомендую использовать pry .

#app.rb
require 'sinatra'
require 'better_errors'
require 'pry' #this is recommended but only for development purposes

use BetterErrors::Middleware
BetterErrors.application_root = __dir__
BetterErrors::Middleware.allow_ip! '172.0.0.0/0'
bettererrors = true

get '/test/:id' do
  "Hello ID: #{params[:id]}"
  raise 'foo'
end

Но я бы порекомендовал использовать pry вместо этого: get '/ test /:id 'do "Hello ID: # {params [: id]}" binding.pry # теперь вы можете извлечь свой стек из консоли ruby!end

Затем просто запустите

ruby app.rb
# then in browser go to  http://localhost:4567/test/123
# better error opens and params are available
# inside better errors console type
params
#=> {"id"=>"123"}

Это также работает, если вы делаете raise без пропущенного сообщения.Предполагается, что Better Errors обрабатывает исключения, поэтому используйте raise, потому что abort - это способ отменить выполнение сценария ruby ​​и его не следует использовать здесь.

Вы можете понять почему, просто протестировавэто из терминала.

irb
#now you're in an interactive ruby shell
abort
#now your ruby shell session is over
irb
raise
#RuntimeError with stack trace

См. это для получения дополнительной информации о командах, которые убивают процессы см.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...