2010-11-11 19 views
-1

Je maintiens un site Web de Ruby-sur-Rails (exécutant réellement JRuby 1.5.5, version 2.3.10 de Rails) et vois quelque chose assez étrange. Une certaine action du contrôleur est à l'origine une exception dans les journaux, quand on y accède par un bot moteur de recherche:Problème de RoR étrange; googlebot obtient l'erreur, l'homme voit la page

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

... Cependant, quand je view the page as a human, il fonctionne très bien. "show_simple_captcha" est une méthode d'un plugin, et il ne peut pas retourner nil.

Quelqu'un a-t-il une idée de la raison pour laquelle RoR répondrait différemment à un bot par rapport à un vrai navigateur? Je ne cherche pas tellement la réponse au problème que je suis un moyen de procéder au débogage, mais j'accepterai volontiers le premier.

+0

javascript dans le captcha. – s84

+0

Pouvez-vous fournir la trace de la pile ou est-ce cela? – rwilliams

+0

@Sam, il n'y a pas de javascript dans le captcha, et de toute façon cela n'explique pas pourquoi je reçois cette erreur sur le côté serveur. – davmac

Répondre

2

Lorsque j'ai essayé d'afficher la page, j'en ai eu 500 aussi. Il y a de fortes chances que quelque chose ne va pas avec votre code. Par exemple, vous vous attendez à ce que la variable session ou cookie soit définie, alors que ce n'est pas le cas.

+1

Si vous utilisez Rails 2, ajoutez "Rails.backtrace_cleaner.remove_silencers" à environment.rb et consultez la trace arrière. L'exception se produit probablement dans le plugin que vous utilisez, mais vous ne pouvez pas voir la trace de la pile puisque Rails essaie de le nettoyer et de ne vous montrer que les lignes du code de votre application. Je déteste cette fonctionnalité et je la désactive tout de suite dans tous mes projets Rails. –

+0

Accepter cette réponse en raison du conseil utile. Il s'avère que le générateur captcha utilise l'identifiant de session, cependant l'identifiant de session peut être nul (pensez que cela a pu changer entre les versions de Rails). Cela a provoqué une exception dans le plugin, que je n'ai pas pu voir à cause du filtrage. Merci! – davmac

1

Il est difficile de dire à partir du message d'erreur et de l'extrait de code ci-dessus, mais est-il possible que cette action suppose que vous êtes connecté au site? Ma première pensée est que l'application a un certain type d'état (cookie, session, etc) et que lorsque vous visitez le site, vous avez déjà établi votre état avec l'application et donc vous ne rencontrez aucun problème. Le Google Bot, d'autre part, peut être juste sauter directement à cette page et manquera de tout état que votre site pourrait supposer était déjà configuré.

Une autre chose qui me vient à l'esprit, c'est que le contrôle captcha pourrait prendre des décisions de rendu basées sur l'agent utilisateur. Peut-être que l'agent utilisateur que Google Bot utilise n'est pas aimé par votre contrôle captcha. Essayez d'obtenir l'un de ces plugins Firefox qui vous permet de modifier votre agent utilisateur et de le définir sur la valeur que vous voyez dans vos journaux. Hit votre site Web et voir ce qui se passe.

+0

Merci pour les suggestions, mais j'ai vérifié le code de la méthode show_simple_captch et il ne peut vraiment pas renvoyer nil. (Et il ne se soucie pas des agents utilisateurs, ce n'est vraiment pas si complexe.) – davmac

+0

(Et, non, il ne suppose pas que vous êtes connecté, un utilisateur connecté ne devrait pas voir le captcha, quand je ' m pas connecté Je vois le captcha comme je devrais). – davmac

+0

vous avez raison, ce n'est probablement pas un problème d'agent d'utilisateur. J'ai visité le site en chrome et il s'est écrasé. Quelque chose ne va pas avec cette page, même pour les non-robots. –

1

Si vous pouvez émuler un bot, commencez le débogage du plugin. Ma conjecture est que c'est un bug avec le plugin lui-même et pas votre application.

0

Je suis moi aussi confronté au même problème. En examinant le plugin, j'ai pu comprendre que lors du rendu de la page sur laquelle il y a captcha, le 'simple_captcha_controller' est appelé pour rendre l'image captcha (regardez l'attribut 'src' de l'image captcha). Dans cet url, le param 'simple_captcha_key' est également passé. La clé est calculée et est passée en paramètre à simple_captcha_controller '. La paire clé-valeur est stockée dans la table 'simple_captcha_date'. Ainsi, quand un humain regarde le formulaire, la clé est pré-calculée (et a une valeur) et envoyée au 'simple_captcha_controller' et donc nous ne voyons pas le problème. Cependant, quand un bot est en train de "visualiser", mécanisme dont je ne comprends pas très bien, la clé transmise au "simple_captcha_controller" n'a pas de valeur dans la table 'simple_captcha_data' et renvoie nil. ('SimpleCaptchaData.get_data (key) .value' dans simple_captcha_config.rb renvoie zéro) L'erreur peut être reproduite si des clés arbitraires sont passées.