2012-02-11 14 views
1

カスタムエラーページをレンダリングするようにRailsに指示する方法はありますか(たとえば、ErrorsControllerに書くもの)?私は多くのトピック、とちょっと仕事がカスタム404ページと500ページを正しくレンダリングする方法は?

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 

のようなあなたのApplicationControllerものに追加して、あなたが望むようにあなたの方法render_errorrender_not_foundを書くことだったように思われるものを検索しました。これは私にとっては本当に不思議な解決策のようです。また、起こり得るすべてのエラーが何であるかを正確に知る必要があるため、悪いことです。一時的な解決策です。

また、実際にActionController::RoutingErrorを救助する簡単な方法はありません。私は1つの方法は、あなたのroutes.rb

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

のようなものを追加したことを見ました。しかし、手動でActionController::RoutingErrorのどこかを上げたければどうでしょうか?たとえば、管理者でない人がURLを推測して "adminy"コントローラにアクセスしようとするとします。このような状況では、私は、実際に彼がURLを推測したことを人に伝えるため、何らかの種類の「不正アクセス」エラーを発生させるよりも404を上回る方が望ましいです。手動で上げると、500ページのレンダリングが試行され、404が欲しいです。

Railsに伝える方法はありますか?「通常は404.htmlまたは500.htmlをレンダリングします。myカスタムの404と500のページ "? (もちろん、フォルダから404.html500.htmlページを削除しました)

答えて

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方法はあなたが、その後うわー、これは本当にすごいですapp/views/errors/404.html.[haml|erb]

+0

でファイルを持っている必要があります

render :template => 'errors/404' 

のようなものでなければならないであろう。このようにして、私は「404の例外」がどれだけあるかを知る必要があります。これは簡単です。素晴らしい解決策:)。 1つの質問、あなたの意見では、不正なアクセスに対処する最良の方法は何ですか? 'ActionController :: RoutingError'を呼び出すと、実際に私にはうってつけの気分になりません。 –

+0

私はまだ15の評判ポイントがないので、投票できません。 –

+1

私はいつも 'head:unauthorized'を使いました。読んだり、意思を表明したりするのは簡単です。 – siannopollo

関連する問題