Лучший способ справиться с RoutingError в Rails 2.1.x? - PullRequest
2 голосов
/ 09 сентября 2008

Я играю с кодом 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

Соль для дополнительной логики, где нам нужна другая логика контроллера, маршруты и т. Д.

Ответы [ 2 ]

4 голосов
/ 16 сентября 2008

Нееет !!! Не используйте method_missing на вашем контроллере! И, пожалуйста, постарайтесь также избегать action_missing.

Часто рекламируемый шаблон - добавить маршрут:

map.connect '*', :controller => 'error', :action => 'not_found'

Где вы можете показать соответствующую ошибку.

В Rails также есть механизм rescue_action_in_public, в котором вы можете написать свою собственную логику обработки ошибок - мы действительно должны ее очистить и призвать людей использовать ее. PDI! : -)

1 голос
/ 09 сентября 2008

Есть метод method_missing. Вы можете реализовать это в вашем Application Controller и перехватить все пропущенные действия, возможно, зарегистрировать их и перенаправить на действие index соответствующего контроллера. Этот подход будет игнорировать все, что не может быть направлено на контроллер, что очень близко к тому, что вы хотите.

В качестве альтернативы, я просто регистрирую все ошибки, извлекаю URL и сортирую его по # разам, когда это произошло.

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