私はこれに対する簡単な答えを途方もなく長い間探していましたが、誰も簡単でばかげた証拠のチュートリアルを持っていないので、これは非常に明白で単純でなければならないようです。
とにかく、私がやりたいのは、エラーがスローされるたびに読み込まれる単一の404.html静的ページを用意することです。理想的には、これは本番環境とステージングでのみ発生するはずです。
これが一番簡単なことだと思いますが…でもわかりません。
どんな助けでも大歓迎です。
ApplicationController
で
unless ActionController::Base.consider_all_requests_local
rescue_from Exception, :with => :render_404
end
private
def render_404
render :template => 'error_pages/404', :layout => false, :status => :not_found
end
今セットアップerror_pages/404.html
そしてそこに行きます
...または、例外に注意しすぎている可能性があります。代わりに、RuntimeErrorから救出する必要があります。
本番モードで実行すると、URLのルートがない場合は常に、パブリックディレクトリの404.htmlが提供されると思います。
本番モードで実行している場合、パブリックディレクトリ内の404.html、500.html、422.htmlファイルは、それぞれのエラーが発生するたびに提供され、上からのページが表示されます。
In Rails 3.1
以下のように使用できます:Rails 3.1は、正しいHTTPステータスコードで応答を自動的に生成します(ほとんどの場合、これは200 OKです)。: statusオプションを使用してこれを変更できます。
レンダリング:ステータス=> 500
レンダリング:ステータス=>:禁止
Rails understands both numeric and symbolic status codes.
乾杯!
すべてのエラーが404になるわけではないため、エラーがスローされても404は取得されません。これが、パブリックディレクトリに404、422、および500ページがある理由です。 Railsは、これらが最も一般的なエラーであると考えています。ベンが言ったように、何かが見つからない場合は404が、アプリケーションがエラーをスローした場合は500が表示されます。2つの間で、あなたはあなたの基地の多くをカバーすることができます。
これを行う別の方法は、次のようにconfig/application.rb
を構成することです。
module YourApp
class Application < Rails::Application
# ...
config.action_dispatch.rescue_responses.merge!(
'MyCustomException' => :not_found
)
end
end
そのため、MyCustomException
が発生するたびに、Railsはそれを通常の:not_found
として扱い、public/404.html
をレンダリングします。
これをローカルでテストするには、config/environments/development.rb
を次のように変更してください。
config.consider_all_requests_local = false
これが私のやり方です。私のapplication_controller.rb
:
def render_404
render file: 'public/404.html', layout: false, status: :not_found
end
次に、404をレンダリングしたいコントローラーで、次のようにします。
@appointment = Appointment.find_by(id: params[:appointment_id]) || render_404