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, и казалось, что имеет смысл добавить в него это промежуточное ПО.

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

Оказывается, что этот конкретный набор ботов так же туп, как камень, и игнорирует любое форматирование запросов, как я пытался это сделать. В итоге я запретил агентам пользователей этих ботов robots.txt, Больше ошибок нет. Однако, если у кого-то есть более элегантное решение, пожалуйста, опубликуйте его, и я отмечу его как принятый ответ, в противном случае я приму его через пару дней.

Другие вопросы по тегам