Я играю с кодом routing.rb в Rails 2.1 и пытаюсь довести его до такой степени, чтобы я мог сделать что-то полезное с исключением RoutingError, которое выдается, когда он не может найти подходящий путь.
Это несколько сложная проблема, потому что есть некоторый класс URL-адресов, которые являются просто ПЛОХОЙ: бот-атака /azenv.php, люди, набирающие / bar / foo / baz в URL и т. Д. не хочу этого.
Тогда есть тонкие проблемы с маршрутизацией, когда мы хотим, чтобы нас уведомляли: / artist / например, или ///. В этих ситуациях мы можем захотеть выдать ошибку или нет ... или мы получим от Google отправку нам URL-адресов, которые раньше были действительными, но больше не были, потому что люди их удалили.
В каждой из этих ситуаций мне нужен способ содержать, анализировать и фильтровать путь, по которому мы возвращаемся, или, по крайней мере, какой-нибудь Railsy способ управлять маршрутизацией за обычным URL-адресом «аварийного возврата». Это существует?
EDIT:
Итак, код здесь:
# File vendor/rails/actionpack/lib/action_controller/rescue.rb, line 141
def rescue_action_without_handler(exception)
log_error(exception) if logger
erase_results if performed?
# Let the exception alter the response if it wants.
# For example, MethodNotAllowed sets the Allow header.
if exception.respond_to?(:handle_response!)
exception.handle_response!(response)
end
if consider_all_requests_local || local_request?
rescue_action_locally(exception)
else
rescue_action_in_public(exception)
end
end
Так что наш лучший вариант - переопределить log_error (исключение), чтобы мы могли отфильтровать исключения в соответствии с исключением. Так в ApplicationController
def log_error(exception)
message = '...'
if should_log_exception_as_debug?(exception)
logger.debug(message)
else
logger.error(message)
end
end
def should_log_exception_as_debug?(exception)
return (ActionController::RoutingError === exception)
end
Соль для дополнительной логики, где нам нужна другая логика контроллера, маршруты и т. Д.