Почему этот рейз не спасает, и что его поправит, чтобы он был?

Я пытаюсь создать собственное исключение StandardError, но, похоже, я не могу активировать escape_from с повышением. Ошибка возникает, но никогда не спасается. Я создал простое приложение, чтобы попробовать это следующим образом:

class ApplicationController < ActionController::Base

  protect_from_forgery with: :exception

  class ApplicationController::LocationInvalid < StandardError
  end

  rescue_from ApplicationController::LocationInvalid, with: :reset_it

  raise ApplicationController::LocationInvalid

  private

  def reset_it(exception)
    session.clear
    cookies['XSRF-TOKEN'] = form_authenticity_token if protect_against_forgery?
    puts 'Reset it processed'
  end
end

Когда я оборачиваю повышение в begin/rescue/end, оно печатает e как ApplicationController::LocationInvalid:

  begin
    raise ApplicationController::LocationInvalid
  rescue => e
    puts e
  end

Выход:

Начат GET "/" для 127.0.0.1 в 2015-08-21 15:19:32 -0400 ApplicationController::LocationInvalid

Я пробовал различные формы указания класса ApplicationController и не без изменений в результатах...


person Richard_G    schedule 21.08.2015    source источник
comment
Попробуйте raise ApplicationController::LocationInvalid.new.   -  person CWitty    schedule 21.08.2015
comment
@CWitty Спасибо за предложение. Выглядело вполне правдоподобно. Тем не менее, результаты были в основном одинаковыми. Я видел заметку, что вы можете поднять что угодно, и, кажется, вы можете поднять класс или экземпляр. Rescue_from, похоже, не разделяет такого небрежного отношения...   -  person Richard_G    schedule 21.08.2015
comment
Интересно, вызываете ли вы исключение во время оценки класса, а определение для reset_it еще не было оценено? Попробуйте поместить raise в метод, а затем вызвать этот метод из консоли или чего-то еще.   -  person Daiku    schedule 21.08.2015
comment
Как сказал Дайку. Помещение его в метод приведет к тому, что его обработает escape_from. Если вы обернете исключение в начало восстановления, то функция save_from не сработает, потому что она уже спасена.   -  person Daniel Logan    schedule 21.08.2015
comment
@DanielLogan Похоже, вы были правы, поместив его в метод, но по причине, указанной edariedl. Я ценю ответ и помощь каждого. Спасибо.   -  person Richard_G    schedule 22.08.2015


Ответы (1)


Согласно исходному коду Rails https://github.com/rails/rails/blob/f62fb985b6a7b90872148f0786219c9cc94c9356/actionpack/lib/action_controller/metal/rescue.rb#L32

rescue_with работает только во время вызова process_action, но вы вызываете исключение во время оценки класса. Вероятно, самый простой способ проверить это - создать простой контроллер с некоторым действием и попытаться вызвать исключение во время этого действия, и rescue_with должно работать.

person edariedl    schedule 21.08.2015
comment
Очень хорошо. Я использовал after_action для выполнения метода, выдавшего ошибку, и сработала служба relay_from. Это помогает мне понять другие вопросы, которые у меня были, например, почему запрос доступен только в методе. Похоже причина та же. Спасибо... - person Richard_G; 22.08.2015