ActionView :: MissingTemplate错误,仅在Bot访问时?

时间:2011-05-10 03:30:32

标签: ruby-on-rails ruby actionview

我有一个为我的主页提供服务的动作。它在正常访问时(即由Web浏览器中的用户)正常工作,但是当特定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的文件并在其中添加一些乱码的唯一方法吗?或者我可以更优雅地解决这个问题吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

事实证明,这一组特定的机器人像摇滚一样愚蠢,并且忽略了我试图做的任何类型的请求格式化。我最终在我的robots.txt中禁止这些机器人的用户代理。没有更多的错误。但是,如果有人有更优雅的解决方案,请发布,我会将其标记为已接受的答案,否则,我会在几天内接受这个。