2013-03-08 23 views
5

Sahte bir görüntü dosyası istiyorsak, Rails 404 yerine 500 dahili sunucu hatası üretir. Aşağıdakine bakın.Görüntü dosyasının eksik olduğu dosyada hata 500 (Rails 3.2.12)

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

Diğer bilinmeyen URL'ler 404'ler ile düzgün işlenir: Burada

404'lerin yakalar routes.rb yılında çizgidir. Dosya uzantılarına sahip resim dosyaları ve URL'ler için farklı olan nedir?

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" 

cevap

4

sorun Default Kontrolörün içinde error_404 yöntem png biçiminde istekleri işleyemez ki:

Muhtemelen kodunuzda bu yerde benzer bir kodu var. bir JSON yanıtı, diyelim için sorduğunuzda, benzer bir URL inşa edebileceğini: Eğer Gördüğünüz gibi

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

gibi bir şey olurdu

/controller/action.json 

Ve eylem içinde olduğu için belirtilen nasıl üzere JSON ve XML isteği işlemek, ancak format.png olmadığı için, eylem .png biçimini kaldıramıyor. Bu ekleyin:

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

Alkış :)

:

format.png # Handle the request here... 

Umut yardımcı olur :)

Edit

404 işleyicisi yönlendirmek için bu ekleme Edit2

kullanın bu kod istekleri her türlü yakalamak için:

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

404 sayfası ile :not_found_view değiştirin. Bu, html istekleri için 404 sayfasını oluşturacak ve başka tür bir istek için kendi kendine (html biçiminde) yönlendirecektir.

yardımcı olur :)

+0

teşekkürler! HTML formatı değilse, HTML görünümünü oluşturup doğru 404 sayfasını göstermeye zorlayabilir miyiz? – Crashalot

+0

Cevabımı düzenledim, umarım yardımcı olur: D – sergelerator

+0

Her şeyi nasıl yakalayabiliriz? Diğer bir deyişle, eğer her birini tek tek belirtmeden herhangi bir dosya uzantısını (ör., .jpg, .gif) yakalamak istersek, nasıl ele alacağız? – Crashalot

0

DefaultController nedir? Bu kontrolör yerine Raylar varsayılan tepkisi, 404 uğraşıyor:

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

Yani bu kontrolör öğrenmek, error_404 yürütülmektedir ve hiçbir şablon varsayılan/error_404, dolayısıyla 500 hatası tespit edildi.

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

biz rotaları bir satırda q güncelleştirildi.Bu, 404'ü yakalayan rb'dir. Buradaki soru, dosya uzantılarına (özellikle görsellere) sahip olmayan bazı URL'ler için neden çalışır? – Crashalot

+0

Hata_404 yönteminin içeriği nedir? Yöntem, sonuna ulaşıyor ve sağlanan formatı kullanarak, erb veya oluşturucu ile bir görünüm oluşturmaya çalışıyor. Bir error_404.png.erb veya error_404.png.builder dosyanız yoksa, bu hatayı uygulamanın şu anda kurulduğu şekilde göreceksiniz. – Leito

+0

ahhh, anladım. 3.2.12'de bunu (ve genel olarak 404'leri) halletmenin doğru yolu nedir? Sorunuzu yanıtlamak için error_404, sadece ilgili .html.erb görünümünü oluşturan boş bir eylemdir. – Crashalot

0

Belki senin için değil umut, ama benim denetleyicileri dinamik sayfalar için bazı son kontrolleri yapmak beri, sadece işlemek için biriyle bütün 404'ing izleyin olmayan html dosyaları: