-1

我维护了一个 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

4 回答 4

2

当我尝试查看该页面时,我也得到了 500。您的代码很可能有问题。例如,您希望设置会话或 cookie 变量,但实际上并未设置。

于 2010-11-11T08:44:51.167 回答
1

从上面的错误消息和代码片段很难看出,但这个操作是否有可能假设您已登录到该站点?

我的第一个想法是该应用程序具有某种类型的状态(cookie、会话等),并且当您访问该网站时,您已经通过该应用程序建立了您的状态,因此您不会遇到任何问题。另一方面,Google Bot 可能只是直接跳转到此页面,并且不会显示您的站点可能假定已设置的任何状态。

我想到的另一件事是验证码控件可能会根据用户代理做出一些渲染决策。您的验证码控件可能不喜欢 Google Bot 正在使用的用户代理。尝试获取那些允许您更改用户代理的 Firefox 插件之一,并将其​​设置为您在日志中看到的值。访问您的网站,看看会发生什么。

于 2010-11-11T05:26:55.487 回答
1

如果您可以模拟机器人,请开始调试插件。我的猜测是这是插件本身的错误,而不是您的应用程序。

于 2010-11-11T06:01:58.230 回答
0

我也面临同样的问题。在研究插件时,我可以理解,在渲染有验证码的页面时,调用“simple_captcha_controller”来渲染验证码图像(查看验证码图像的“src”属性)。在此 url 中,还传递了参数“simple_captcha_key”。计算密钥并作为参数传递给 simple_captcha_controller'。键值对存储在表“simple_captcha_date”中。因此,当人们查看表单时,密钥是预先计算的(并且有一个值)并发送到“simple_captcha_controller”,因此我们看不到问题。但是,当机器人“查看”时,我不太了解的机制,传递给“simple_captcha_controller”的密钥不会“ t 在“simple_captcha_data”表中有一个值并返回 nil。(simple_captcha_config.rb 中的'SimpleCaptchaData.get_data(key).value' 返回nil)如果传递任意键,则可以重现该错误。

于 2011-08-25T11:05:56.623 回答