Как создать исключение в Rails, чтобы он вел себя как другие исключения Rails?
Я хотел бы создать исключение, чтобы оно делало то же самое, что и обычное исключение Rails. Специально, покажите трассировку исключения и стека в режиме разработки и покажите страницу "Мы сожалеем, но что-то пошло не так" в режиме производства.
Я попробовал следующее:
raise "safety_care group missing!" if group.nil?
Но он просто записывает "ERROR signing up, group missing!"
в файл development.log
Ответы
Ответ 1
Вам не нужно ничего делать, он должен просто работать.
Когда у меня есть новое приложение для рельсов с этим контроллером:
class FooController < ApplicationController
def index
raise "error"
end
end
и перейдите к http://127.0.0.1:3000/foo/
Я видя исключение с трассировкой стека.
Возможно, вы не видите весь стек в журнале консоли, потому что Rails (начиная с версии 2.3) фильтрует строки из трассировки стека, которые исходят из самой структуры.
См. config/initializers/backtrace_silencers.rb
в проекте Rails
Ответ 2
Вы можете сделать это следующим образом:
class UsersController < ApplicationController
## Exception Handling
class NotActivated < StandardError
end
rescue_from NotActivated, :with => :not_activated
def not_activated(exception)
flash[:notice] = "This user is not activated."
Event.new_event "Exception: #{exception.message}", current_user, request.remote_ip
redirect_to "/"
end
def show
// Do something that fails..
raise NotActivated unless @user.is_activated?
end
end
Что вы здесь делаете, это создать класс "NotActivated", который будет использоваться как "Исключение". Используя рейз, вы можете бросить "NotActivated" в качестве исключения. rescue_from - это способ уловить исключение с помощью указанного метода (not_activated в этом случае). Довольно длинный пример, но он должен показать вам, как это работает.
С наилучшими пожеланиями,
Fabian
Ответ 3
Если вам нужен более простой способ сделать это, и вы не хотите много шумихи, простое выполнение может быть:
raise Exception.new('something bad happened!')
Это вызовет исключение, скажем e
с e.message = something bad happened!
а затем вы можете спасти его, когда вы спасете все остальные исключения в целом.