1

Rails にカスタム エラー ページをレンダリングするように指示する方法はありますか (たとえば、ErrorsController. 私は多くのトピックを検索しましたが、ちょっとうまくいくように見えるのは、次のApplicationControllerようなものを追加することでした

if Rails.env.production?
  rescue_from Exception, :with => :render_error
  rescue_from ActiveRecord::RecordNotFound, :with => :render_not_found
  rescue_from ActionController::UnknownController, :with => :render_not_found
  rescue_from ActionController::UnknownAction, :with => :render_not_found
end

render_error次に、メソッドと希望する方法を記述しますrender_not_found。これは、本当にエレガントではない解決策のように思えます。また、発生する可能性のあるすべてのエラーが何であるかを正確に知る必要があるため、これは悪いことです。一時的な解決策です。

また、そのように救助する簡単な方法は本当にありませんActionController::RoutingError。1つの方法は、次のようなものを追加することであることがわかりました

get "*not_found", :to => "errors#not_found"

あなたにroutes.rb。しかし、どこかでActionController::RoutingError手動でレイズしたい場合はどうしますか? たとえば、管理者ではない人が URL を推測して「adminy」コントローラーにアクセスしようとするとします。そのような状況では、ある種の「不正アクセス」エラーを発生させるよりも 404 を発生させるほうが好きです。手動で上げると、500 ページをレンダリングしようとしますが、404 が必要です。

では、Rails に次のように伝える方法はあります404.html500.html? (もちろん、フォルダから404.html500.htmlページを削除しました。)public

4

1 に答える 1

1

残念ながら、私が知っている方法で、必要なものを提供するためにオーバーライドできる方法はありません。アラウンドフィルターを使用できます。コードは次のようになります。

class ApplicationController < ActionController::Base
  around_filter :catch_exceptions

  protected
    def catch_exceptions
      yield
    rescue => exception
      if exception.is_a?(ActiveRecord::RecordNotFound)
        render_page_not_found
      else
        render_error
      end
    end
end

その方法に適していると思われる場合は、各エラーを処理できます。次に、あなた#render_page_not_found#render_errorメソッドは次のようなものでなければなりません

render :template => 'errors/404'

次に、次の場所にファイルを作成する必要があります。app/views/errors/404.html.[haml|erb]

于 2012-02-11T17:28:13.373 に答える