Странная проблема RoR; гуглбот получает ошибку, человек видит страницу

Я поддерживаю веб-сайт Ruby-on-Rails (на самом деле работает на JRuby 1.5.5, Rails версии 2.3.10) и вижу нечто довольно странное. Определенное действие контроллера вызывает исключение в журналах, когда к нему обращается бот поисковой системы:

ActionView::TemplateError (can't convert nil into String) on line #14 of app/vie
ws/scenarios/show_send_message.rhtml:
11:   <% if ! is_logged_in? %>
12:     <p>Your email (optional, used to contact you if necessary):<br /><%= tex
t_field_tag 'user_email', @user_email || '', :size => 50 %>
13:     <% if ! is_human? %>
14:       <%= show_simple_captcha %>
15:     <% end %>
16:   <% end %>
17:   <p><%= submit_tag 'Send' %>

... Однако, когда я рассматриваю страницу как человека, она работает нормально. "show_simple_captcha" - это метод из плагина, и он не может вернуть nil.

Кто-нибудь знает, почему RoR реагирует на бота иначе, чем на настоящий браузер? Я не столько ищу ответ на проблему, сколько способ отладки, но я с радостью приму первое.

4 ответа

Решение

Когда я попытался просмотреть страницу, я тоже получил 500. Есть большая вероятность, что с вашим кодом что-то не так. Например, вы ожидаете, что переменная сессии или cookie будет установлена, а это не так.

Если вы можете эмулировать бота, начните отлаживать плагин. Я предполагаю, что это ошибка самого плагина, а не вашего приложения.

По приведенному выше сообщению об ошибке и фрагменту кода трудно сказать, но возможно ли, что это действие предполагает, что вы вошли на сайт?

Сначала я подумал, что у приложения есть какой-то тип состояния (cookie, сеанс и т. Д.) И что, когда вы посещаете веб-сайт, вы уже установили свое состояние с помощью приложения и, следовательно, у вас не возникает никаких проблем. С другой стороны, бот Google может просто перейти прямо на эту страницу, и ему будет не хватать состояния, которое, по вашему мнению, сайт уже настроил.

Еще одна вещь, которая приходит мне в голову, это то, что элемент управления captcha может принимать некоторые решения для рендеринга на основе пользовательского агента. Возможно, пользовательский агент, который использует Google Bot, не понравился вашему контрольному элементу. Попробуйте получить один из тех плагинов Firefox, который позволит вам изменить свой пользовательский агент и установить для него значение, которое вы видите в своих журналах. Зайдите на ваш сайт и посмотрите, что получится

Я тоже сталкиваюсь с той же проблемой. Исследуя плагин, я понял, что при рендеринге страницы, на которой есть капча, вызывается 'simple_captcha_controller' для отрисовки изображения капчи (посмотрите на атрибут 'src' изображения капчи). В этом URL также передается параметр 'simple_captcha_key'. Ключ вычисляется и передается в качестве параметра в simple_captcha_controller '. Пара ключ-значение хранится в таблице simple_captcha_date. Таким образом, когда человек просматривает форму, ключ предварительно рассчитывается (и имеет значение) и отправляется в 'simple_captcha_controller', и, следовательно, мы не видим проблемы. Однако, когда бот "просматривает", механизм которого я не совсем понимаю, ключ, переданный в "simple_captcha_controller", не имеет значения в таблице "simple_captcha_data" и возвращает ноль. ('SimpleCaptchaData.get_data(key).value' в simple_captcha_config.rb возвращает nil) Ошибка может быть воспроизведена, если переданы произвольные ключи.

Другие вопросы по тегам