Отсутствует шаблон блогов / указателей по проекту Ruby on Rails - PullRequest
15 голосов
/ 05 апреля 2011

Для одного из моих проектов время от времени я получаю это исключение:

ActionView :: MissingTemplate: отсутствующие шаблоны блогов / индексов с {: handlers => [: rxml,: erb,: builder,: rjs,: haml,: rhtml],: format => ["image / jpeg", "image / pjpeg", "image / png", "image / gif"],: locale => [: en,: en]} в путях просмотра "/ var / www / keeponposting / release / 20110403083651 / app / views"

Кажется, кто-то запрашивает изображение с URL, который не является изображением:

HTTP_ACCEPT "image / jpeg, image / pjpeg, image / png, image / gif"

Есть идеи, что с этим делать? Нужно ли реализовывать обработчик для одного из них и возвращать "", чтобы избавиться от этих исключений, или есть лучший способ его обработать?

Теперь я также получаю это:

ActionView :: MissingTemplate: отсутствуют шаблоны блогов / индексов с {: format => ["text / *"],: handlers => [: rjs,: haml,: rhtml,: erb,: rxml,: builder] ,: locale => [: en,: en]} в путях просмотра "/ var / www / keeponposting / Releases / 20110415040109 / app / views"

Нет ли способа отправить обратно HTML независимо от того, какой формат запрашивается?

Ответы [ 6 ]

13 голосов
/ 23 мая 2011

Я согласен с блокировкой робота-нарушителя, но если вы действительно хотите форсировать формат ответа, добавьте before_filter и установите request.format = :html, например так:

before_filter :force_request_format_to_html

private

def force_request_format_to_html
  request.format = :html
end
8 голосов
/ 22 декабря 2011

Я исправил эту проблему (несколько минут назад - пока что хорошо) с помощью этой новой опции Rails 3.1:

config.action_dispatch.ignore_accept_header = true

Как уже упоминалось в , эта проблема Rails .Это относится к config/application.rb.

Я проверил это так в тесте запроса RSpec (с использованием Capybara):

it "should not break with HTTP_ACCEPT image/*;w=320;h=420 from iPhone" do
  page.driver.header "Accept", "image/*;w=320;h=420"
  visit "/some/path"
  page.should have_content("Some content")
end
6 голосов
/ 29 апреля 2013

Вот более строгий ответ; предложение purp из обсуждения вопроса 4127 .

class FooController
  rescue_from  ActionView::MissingTemplate, :with => :missing_template

  def missing_template
    render :nothing => true, :status => 406
  end
end
5 голосов
/ 06 апреля 2011

Я хотел бы спасти MissingTemplate в вашем контроллере приложения и зарегистрировать заголовок Referrer, чтобы увидеть, что вызывает этот запрос. Вы никогда не знаете, это может быть какая-то неясная часть вашего собственного приложения!

Если, с другой стороны, вы уверены, что это вызвано роботом, рассматривали ли вы вопрос об добавлении некорректного URL в файл robots.txt? Например:

User-Agent: YandexImages
Disallow: /your/failed/path

Замена «ваш / неудачный / путь» на путь, по которому робот спотыкается. Если робот борется повсюду, вы можете просто запретить доступ ко всему сайту для этого конкретного робота:

User-Agent: YandexImages
Disallow: /

Я думаю, что это более чистый и лёгкий подход, чем реализация обработчика, специально предназначенного для подавления ошибок, казалось бы, бота с плохим поведением.

0 голосов
/ 14 сентября 2015

Добавить formats: [:html] для визуализации:

def action
  render formats: [:html]
end
0 голосов
/ 13 марта 2015

Я сделал это: В моем контроллере я поставил фильтр перед:

def acceptable_mime_type
  unless request.accepts.detect{|a| a == :json || a == :html} || request.accepts.include?(nil)
    if request.accepts.detect{|a| a.to_s().include?("*/*")}
      ActionDispatch::Request.ignore_accept_header = true
    else
      render text: "Unacceptable", status: 406
      false
    end
  end
end

Он проверяет мои поддерживаемые типы (например, json, html) и nil (nil отображает html по умолчанию), затем, если эти типы MIME не поддерживаются, он проверяет наличие " / " в заголовке. Если он его находит, я заставляю rails отображать тип mime по умолчанию, игнорируя заголовок accept.

Чтобы проверить это в rspec, я должен был сделать это:

describe 'bad header' do
  describe 'accept' do
    let(:mimeTypes) { ["application/text, application/octet-stream"] }

    it 'should return a 406 status code' do
      request.accept = mimeTypes
      get 'index'
      expect(response.response_code).to eq 406
    end

    describe 'with */* included' do
      it 'should return a 200 status code' do
        request.accept = ["*/*"] + mimeTypes
        get 'index'
        expect(response.response_code).to eq 200
      end
    end
  end
end

По какой-то причине у меня возникли проблемы при попытке правильно отправить заголовки accept в rspec с использованием методов, описанных здесь , но я обнаружил, что если установить request.accept для Array, оба моих теста пройдены. Странно, я знаю, но сейчас я перехожу к следующему вопросу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...