Ruby on rails - ActionView::Missing Template 错误,仅在机器人访问时



我有一个操作为我的主页服务。它在正常访问时(即由网络浏览器中的用户访问)时工作正常,但是当特定网络爬虫访问时,它会抛出以下错误:

 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 的文件并在其中添加一些胡言乱语的唯一方法吗?或者我可以更优雅地解决这个问题吗?

我也看到了这些。您可以使用一些中间件来重写这些请求:

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发现请求,将这个中间件添加到其中似乎是有意义的。

https://github.com/jwigal/rack-options-request

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

最新更新