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/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 ответа
Я тоже видел это. Вы можете использовать промежуточное программное обеспечение для переписывания этих запросов:
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, и казалось, что имеет смысл добавить в него это промежуточное ПО.
Оказывается, что этот конкретный набор ботов так же туп, как камень, и игнорирует любое форматирование запросов, как я пытался это сделать. В итоге я запретил агентам пользователей этих ботов robots.txt
, Больше ошибок нет. Однако, если у кого-то есть более элегантное решение, пожалуйста, опубликуйте его, и я отмечу его как принятый ответ, в противном случае я приму его через пару дней.