我有一个为我的主页提供服务的动作。它在正常访问时(即由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
的文件并在其中添加一些乱码的唯一方法吗?或者我可以更优雅地解决这个问题吗?
答案 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,并且将这个中间件添加到其中似乎是有意义的。
答案 1 :(得分:0)
事实证明,这一组特定的机器人像摇滚一样愚蠢,并且忽略了我试图做的任何类型的请求格式化。我最终在我的robots.txt
中禁止这些机器人的用户代理。没有更多的错误。但是,如果有人有更优雅的解决方案,请发布,我会将其标记为已接受的答案,否则,我会在几天内接受这个。