2013-03-08 6 views
5

偽の画像ファイルをリクエストした場合、Railsは404の代わりに内部500サーバエラーを生成します。以下のログを参照してください。ここで画像ファイルがない場合の内部サーバエラー500(Rails 3.2.12)

は404エラーをキャッチroutes.rbをの行です:

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

その他の未知のURLが404エラーで正しく処理されています。イメージファイルとファイル拡張子を持つURLではどのような違いがありますか?

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" 

答えて

4

問題がDefaultコントローラ内部のerror_404方法は、PNG形式のリクエストを処理できないということです。あなたが見ることができるように、それがどのように指定されています

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

のようなものを持っているでしょう

/controller/action.json 

とアクション内部:あなたはJSONレスポンス、発言を求めるとき、あなたは次のようにURLを構築することができJSONとXMLリクエストを処理しますが、format.pngがないため、アクションで.pngフォーマットを処理できません。これを追加:

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

乾杯:)

format.png # Handle the request here... 

はホープは役立ちます:)

編集

をあなたの404ハンドラにリダイレクトするようにこれを追加編集2

使用このコードは、要求のすべての種類をキャッチする:

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ページで:not_found_viewを交換してください。これにより、404ページのhtml要求がレンダリングされ、他の種類の要求に対してはself(HTML形式)にリダイレクトされます。

は、それが役立ちます:)

+0

! HTML形式でない場合は、HTMLビューを表示して正しい404ページを表示できますか? – Crashalot

+0

私の答えを編集しました、それが助けてくれることを願っています:D – sergelerator

+0

キャッチオールを設定する方法は?言い換えれば、個別に指定せずにファイル拡張子(例:.jpg、.gif)を取得するにはどうすればよいでしょうか? – Crashalot

0

DefaultControllerとは何ですか?そのコントローラが代わりにRailsのデフォルトの応答を、404を扱っている:

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

だから、このコントローラを見つける、error_404が実行されていると何のテンプレートデフォルト/ error_404は、したがって、500エラーは見られませんでした。

あなたはおそらく、あなたのコードでこのどこかのようなコードを持っている:

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

qのルートをqで更新しました。rbは404をキャッチします。質問は、ファイル拡張子(特に画像)を持つURLではなく、一部のURLではどうして動作するのですか? – Crashalot

+0

メソッドerror_404の内容は何ですか?メソッドは終了し、提供された形式:pngを使用して、erbまたはbuilderでビューをレンダリングしようとしています。 error_404.png.erbまたはerror_404.png.builderがある場合を除き、アプリが現在設定されている方法でこのエラーが表示されます。 – Leito

+0

ああ、わかりました。 3.2.12でこれを(そして一般的に404)扱う正しい方法は何ですか?あなたの質問に答えるために、error_404は空のアクションで、対応する.html.erbビューをレンダリングするだけです。ありがとうございます! – Crashalot

0

をそうでないかもしれないあなたのために願っていますが、私は私のコントローラでの動的ページのいくつかの最終チェックを行うために、私は、HTML以外のファイルを処理するために、1とすべての私の404'ingに従います。

format.all { render :status => 404, :nothing => true } 
関連する問題