2011-02-05 15 views
8

Moje Rails 3 strona jest trafiony przez roboty dziwne akceptuje nagłówki, wyjątki progowych jak jakSzyny 3 i Strange Zebrane nagłówków

ActionView::MissingTemplate occurred in home#show 

Oto niektóre z nagłówków akceptują przyczyną problemów

text/* 
application/jxw 
*/*;q=0.1 

W takich przypadkach jest to interpretowane jako format żądania i jako takie powoduje błąd brakującego szablonu. Naprawdę nie obchodzi mnie, co wrócę do tych robotów, ale po prostu chcę uniknąć wyjątków.

+0

Wygląda na to, że został rozwiązany w Rails 3.1. Dyskusja tutaj: https://github.com/rails/rails/issues/701 – tee

Odpowiedz

7

Można uratować z wyjątkiem jak to w kontrolerze aplikacji i renderować szablon HTML zamiast:

class ApplicationController 
    rescue_from ActionView::MissingTemplate, :with => :render_html 

    def render_html 
    if not request.format == "html" and Rails.env.production? 
     render :format => "html" 
    else 
     raise ActionView::MissingTemplate 
    end 
    end 
end 
+1

Czekaj co? 'not request.format ==" html "'? Czy chodziło Ci o 'request.format! =" Html "? –

+0

Czy istnieje dobry sposób wysyłania żądań w moim lokalnym środowisku w celu zasymulowania danego problemu? Chciałbym wypróbować tę poprawkę, ale chcę mieć pewność, że działa ona prawidłowo przed wdrożeniem jej do produkcji. – blim8183

+1

curl -H 'Zaakceptuj: image/jpeg' http: // localhost: 3000/youraction – todd

1

Ponieważ SO zapobiega dodawaniu komentarzy, dopóki nie mam 50 reputacji, muszę wysłać nową odpowiedź, aby odpowiedzieć na pytanie Ryana Bigga w komentarzach.

not request.format == "html" to mniej więcej to samo co request.format != "html". and, or i not są logicznie identyczne z &&, || i ! - mają jednak znacznie niższy priorytet. Tak więc w tym przykładzie operator == ocenia przed operatorem not, że daje taki sam wynik, jak przy użyciu !=.

+1

Oczywiście, ale Ryan najprawdopodobniej oznaczał, że sposób, w jaki sformułowano 'not foo == bar', sprawia, że ​​trudniej jest sparsować (dla człowieka) niż' foo! = bar'. –