ActionView:: Ошибка MissingTemplate, только если вы посетили бот?
У меня есть действие, которое служит моей домашней странице. Он отлично работает при обычном посещении (например, пользователем в веб-браузере), но при посещении конкретными сканерами Интернета он вызывает следующую ошибку:
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/[email protected]/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
и поместить в него какую-то тарабарщину? Или я могу решить это более элегантно?
Ответы
Ответ 1
Я тоже видел их. Вы можете использовать некоторое промежуточное программное обеспечение для перезаписи этих запросов:
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
Ответ 2
Оказывается, этот конкретный набор ботов такой же тупой, как рок, и игнорирует любое форматирование запроса, как я пытался это сделать. Я закончил тем, что не разрешил этим агентам ботов в моем robots.txt
. Больше ошибок. Однако, если у кого-то есть более элегантное решение, отправьте его, и я пометю его как принятый ответ, иначе я приму это через пару дней.