6

偽のイメージ ファイルをリクエストすると、Rails は 404 ではなく 500 サーバー エラーを生成します。以下のログを参照してください。

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

3 に答える 3

4

問題は、コントローラーerror_404内のメソッドDefaultが png 形式のリクエストを処理できないことです。たとえば、JSON 応答を要求すると、次のような URL を作成できます。

/controller/action.json

そして、アクション内には次のようなものがあります

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

ご覧のとおり、JSON および XML リクエストの処理方法が指定されていますが、 がないformat.pngため、アクションはその.png形式を処理できません。これを追加:

format.png # Handle the request here...

それが役に立てば幸い :)

編集

これを追加して、404 ハンドラーにリダイレクトします。

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

乾杯 :)

編集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

:not_found_view404 ページに置き換えます。これにより、html リクエストの場合は 404 ページがレンダリングされ、他の種類のリクエストの場合は (html 形式で) 自分自身にリダイレクトされます。

それが役に立てば幸い :)

于 2013-03-08T19:59:36.653 に答える
0

とはDefaultController? そのコントローラーは、Rails のデフォルトの応答ではなく、404 を処理しています。

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

したがって、このコントローラーを見つけてください。error_404 が実行されており、テンプレートの default/error_404 が見つからなかったため、500 エラーが発生しました。

コードのどこかに次のようなコードが含まれている可能性があります。

rescue_from ActiveRecord::RecordNotFound, :with => :error_404
于 2013-03-08T19:43:01.677 に答える