当被爬虫访问时出现ActionView::MissingTemplate错误?

15

我有一个用于提供首页的操作。当普通用户在web浏览器中访问时,它可以正常工作,但是当特定的网络爬虫访问时,它会抛出以下错误:

 A ActionView::MissingTemplate occurred in tags#promoted:

 Missing template tags/promoted with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml], :formats=>["text/*"], :locale=>[:en, :en]} in view paths "/Apps/accounts/app/views", "/usr/local/rvm/gems/ruby-1.9.2-p180@accounts/gems/devise-1.3.0/app/views"
 actionpack (3.0.4) lib/action_view/paths.rb:15:in `find'

看起来机器人正试图获取text/*格式,但是没有相应的模板,这很合理,因此我尝试在我的操作中执行以下操作:

  def promoted
   request.format = :html #force html to avoid causing missing template errors
   # more action stuff....
  end

本质上,我正在尝试强制请求的格式为HTML,以便它提供HTML模板。

然而每次这些机器人请求此页面时,都会出现缺少模板错误。

这不是什么大问题,但理想情况下,我想解决这个错误,即使只是为了停止从我的应用程序接收这些错误电子邮件。

是否唯一的方法是创建一个名为my_action.text.erb的文件并在其中放一些无意义的内容?还是我可以更优雅地解决这个问题?


你能发布一下你的控制器代码,特别是“index”操作吗?这应该很容易解决,在一分钟内就可以梳理出Rails自动服务格式的问题。 - nessur
2个回答

7

我也见过这些。您可以使用一些中间件来重新编写这些请求:

class Bot
  def initialize(app)
    @app = app
  end

  def call(env)
    h = env["HTTP_ACCEPT"]
    env["HTTP_ACCEPT"] = "text/html" if h == "text/*"
    @app.call(env)
  end
end

我复刻了一个用于去除一些MS Office Discovery请求的gem,将这个中间件加入它似乎是有意义的。 https://github.com/jwigal/rack-options-request

0

事实证明,这组特定的机器人非常愚蠢,忽略了我尝试进行的任何请求格式。最终,我在我的robots.txt中禁止了这些机器人的用户代理。不再出现错误。但是,如果有人有更优雅的解决方案,请发帖并将其标记为被接受的答案,否则,我将在几天后接受这个答案。


你是否曾经找到了一个好的解决方案,LinkedInBot在这里抛出了这些异常。 - FastSolutions

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接