2013-03-08 18 views
5

Jeśli zażądamy fałszywego pliku obrazu, Rails generuje wewnętrzny błąd 500 serwera zamiast 404. Zobacz dziennik poniżej.Wewnętrzny błąd serwera 500 na brakującym pliku obrazu (Rails 3.2.12)

Oto wiersz routes.rb że łapie błędy 404:

# Catches all 404 errors and redirects 
match '*url' => 'default#error_404' 

innych nieznanych adresy są obsługiwane prawidłowo błędy 404. Czym różnią się pliki graficzne i adresy URL z rozszerzeniami plików?

Started GET "/images/doesnotexistyo.png" for 71.198.44.101 at 2013-03-08 07:59:24 +0300 
Processing by DefaultController#error_404 as PNG 
    Parameters: {"url"=>"images/doesnotexistyo"} 
Completed 500 Internal Server Error in 1ms 

ActionView::MissingTemplate (Missing template default/error_404, application/error_404 with {:locale=>[:en], :formats=>[:png], :handlers=>[:erb, :builder]}. Searched in: 
    * "/home/prod/Prod/app/views" 

Odpowiedz

4

Problem polega na tym, że metoda wewnątrz sterownika Defaulterror_404 nie może obsłużyć żądania w formacie PNG. Kiedy prosisz powiedzmy, odpowiedzi JSON, można zbudować URL podobny do:

/controller/action.json 

i wewnątrz działaniem byłoby mieć coś podobnego

def action 
    respond_to do |format| 
    format.html # Renders the default view 
    format.json { render :json => @model } 
    format.xml { render :xml => @model } 
    end 
end 

Jak widać, jest to określony sposób obsługuje żądanie JSON i XML, ale ponieważ nie ma żadnego format.png, akcja nie może obsłużyć formatu .png. Dodaj to:

format.png # Handle the request here... 

Nadzieja to pomaga :)

Edycja

dodać to do przekierowania do 404 Handler:

def error_404 
    respond_to do |format| 
    format.html 
    format.png { redirect_to :controller => 'default', :action => 'error_404' } 
    end 
end 

Cheers :)

Edit2

użyć tego kodu, aby złapać wszystkie rodzaje wniosków:

def error_404 
    respond_to do |format| 
    format.html { render :not_found_view } 
    format.all { redirect_to controller: 'default', action: 'error_404' } 
    end 
end 

Wymień :not_found_view ze strony 404. Spowoduje to wyświetlenie strony 404 dla żądań html i przekierowanie do self (z formatem html) dla dowolnego innego rodzaju żądania.

Nadzieja to pomaga :)

+0

dzięki! jeśli nie jest to format HTML, czy możemy zmusić go do renderowania widoku HTML i wyświetlania prawidłowej strony 404? – Crashalot

+0

Zmieniono moją odpowiedź, mam nadzieję, że pomoże: D – sergelerator

+0

Jak możemy ustawić catch-all? Innymi słowy, jeśli chcemy uchwycić dowolne rozszerzenie pliku (np. .jpg, .gif) bez określania każdego z nich osobno, w jaki sposób podejdziemy do niego? – Crashalot

0

Co to jest ? Że kontroler ma do czynienia z 404, zamiast domyślnej Rails odpowiedzi:

ActionController::RoutingError (No route matches [GET] "/images/doesnotexistyo.png"): 

więc dowiedzieć się tego kontrolera, error_404 jest wykonywany i nie Domyślny szablon/error_404 stwierdzono, stąd błąd 500.

Prawdopodobnie masz kodu podobnego do tego gdzieś w kodzie:

rescue_from ActiveRecord::RecordNotFound, :with => :error_404 
+0

zaktualizowaliśmy q za pomocą linii na trasach.rb, który przechwytuje 404. pytanie brzmi, dlaczego działa ono dla niektórych adresów URL, a nie dla rozszerzeń plików (w szczególności obrazów)? – Crashalot

+0

Jaka jest zawartość metody error_404? Metoda zbliża się do końca i próbuje renderować widok za pomocą narzędzia erb lub builder, korzystając z podanego formatu: png. Jeśli nie masz błędu error_404.png.erb lub error_404.png.builder, zobaczysz ten błąd w sposób, w jaki aplikacja jest właśnie skonfigurowana. – Leito

+0

ahhh, rozumiem. jaki jest właściwy sposób na obsłużenie tego (i 404 w ogóle) w 3.2.12? aby odpowiedzieć na twoje pytanie, error_404 to pusta akcja, która renderuje odpowiedni widok .html.erb. – Crashalot

0

Może nie dla ciebie, ale ponieważ mam pewne końcowe kontrole dla stron dynamicznie moich kontrolerów, po prostu śledzić wszystkie moje 404'ing z jednego do obsługi non-html pliki:

format.all { render :status => 404, :nothing => true } 
Powiązane problemy