11

このチュートリアルを使用して、カスタム 404 および 500 ページがセットアップされた Rails サーバーがあります。

http://ramblinglabs.com/blog/2012/01/rails-3-1-adding-custom-404-and-500-error-pages

うまく機能し、あらゆる種類のパスに対して 404 をスローしますが、en/foo.png、en/foo.pdf、en/foo.xml などのサフィックス付きパスにアクセスしようとすると、内部サーバー エラー 500 が生成されます。

しかし、en/file.foo のようなものは 404 をスローします。したがって、有効なサフィックスのみが 500 をスローします。

routes.rb の終わり:

if Rails.application.config.consider_all_requests_local
  match '*not_found', to: 'errors#error_404'
end

application_controller.rb

  unless Rails.application.config.consider_all_requests_local
    rescue_from Exception, with: :render_500
    rescue_from ActionController::RoutingError, with: :render_404
    rescue_from ActionController::UnknownController, with: :render_404
    rescue_from ::AbstractController::ActionNotFound, with: :render_404
    rescue_from ActiveRecord::RecordNotFound, with: :render_404
  end

  protected

  def render_404(exception)
    @not_found_path = exception.message
    respond_to do |format|
      format.html { render template: 'errors/error_404', layout: 'layouts/application', status: 404 }
      format.all { render nothing: true, status: 404 }
    end
  end

  def render_500(exception)
    logger.fatal(exception)
    respond_to do |format|
      format.html { render template: 'errors/error_500', layout: 'layouts/application', status: 500 }
      format.all { render nothing: true, status: 500}
    end
  end

表示される 500:

Missing template errors/error_404 with {:locale=>[:de, :en], :formats=>[:png], :handlers=>[:erb, :builder, :coffee, :arb, :haml]}
4

2 に答える 2

14

間違いを見つけました。

これを含む error_controller.rb がありました。

  def error_404
    @not_found_path = params[:not_found]
    render template: 'errors/error_404', layout: 'layouts/application', status: 404
  end

この問題を修正するために、次のように変更しました。

  def error_404
    @not_found_path = params[:not_found]
    respond_to do |format|
      format.html { render template: 'errors/error_404', layout: 'layouts/application', status: 404 }
      format.all { render nothing: true, status: 404 }
    end
  end
于 2012-04-25T18:13:41.530 に答える
1

追加してみる

respond_to :html, :json, :png

およびコントローラーの上部にあるその他の必要な形式。私が正しければ、問題は、個々のコントローラー アクションが応答する形式の 1 つとしてformat.all含めるように設定されていないことです。:png

おそらくconfig/environment.rb、次の定義と同様のものを追加する必要があります。

Mime::Type.register "image/png", :png

詳細はこちらをご覧ください。基本的に、応答したい MIME タイプを設定する必要があります。エラー メッセージは、Rails が format をレンダリングする方法を理解していないことを示していますpng

于 2012-04-25T08:13:53.367 に答える