2010-11-11 2 views
-1

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

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' %> 

... Тем не менее, когда я view the page as a human, он отлично работает. «show_simple_captcha» - это метод из плагина, и он не может вернуть нуль.

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

+0

javascript in captcha. – s84

+0

Можете ли вы предоставить трассировку стека или это так? – rwilliams

+0

@Sam, в кавычках нет javascript, и в любом случае это не объясняет, почему я получаю эту ошибку на стороне сервера. – davmac

ответ

2

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

+1

Если вы используете Rails 2, добавьте «Rails.backtrace_cleaner.remove_silencers» в environment.rb и посмотрите обратную трассировку. Исключение, вероятно, происходит в плагине, который вы используете, но вы не можете видеть трассировку стека, поскольку Rails пытается ее очистить и показывать только строки из вашего кода приложения. Я ненавижу эту функцию, и я отключил ее сразу во всех моих проектах Rails. –

+0

Принимая этот ответ из-за полезного совета. Оказывается, генератор captcha использует идентификатор сеанса, однако идентификатор сеанса, по-видимому, может быть равен нулю (думаю, это могло измениться между версиями Rails). Это вызвало исключение в плагине, который я не мог видеть из-за фильтрации. Благодаря! – davmac

1

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

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

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

+0

Спасибо за предложения, но я проверил код метода show_simple_captch, и он действительно не может вернуть нуль. (И он не заботится о пользовательских агентах, он действительно не такой сложный.) – davmac

+0

(И нет, он не предполагает, что вы вошли в систему; зарегистрированный пользователь не должен видеть captcha, m не вошел в систему. Я вижу капчу, как должен). – davmac

+0

Вы правы, это, вероятно, не проблема с пользовательским агентом. Я посетил веб-сайт в хроме, и он разбился. Что-то не так с этой страницей даже для не роботов. –

1

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

0

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