22

sayfalarını işleme özelleştirilmiş hata oluşturmak için birçok çözüm vardır, ancak Raylar için neredeyse hiçbiri 4:Raylar 4: Varlık boru hattını kullanan özel bir 404 sayfasını nasıl oluştururum?

insanları teşvik standart cevap doesn /public yılında 404.html değiştirmek için' Benim için çalışıyorum çünkü varlık boru hattında bulunan CSS temasını kullanmak istiyorum. Html dosyalarının varlık boru hattında tanımlanan stillere erişebilmesinin bir yolu var mı? Değilse, , boru hattına erişimi olan özel bir hata işleyicisi oluşturmanın bir yolu var mı?

+0

ne istiyorsun var. ** Ancak Rails 4 ** için neredeyse hiç yok, ikinci referans raylar 4 üzerinde çalışmadığından emin misiniz? Sen zaten ne yaptın? –

cevap

5

Sizin için bunu yapan bir mücevher hazırladık: exception_handler.

Ayrıca harika bir eğitici here vardır.

Ayrıca konuyla ilgili kapsamlı bir cevap yazdım here.

Ara Katman

# config/application.rb 
config.exceptions_app = ->(env) { ExceptionController.action(:show).call(env) } 

Kontrolör

# app/controllers/exception_controller.rb 
class ExceptionController < ApplicationController 
    respond_to :json, :js, :html 
    before_action :set_status 

    def show 
    respond_with @status 
    end 

    private 

    def set_status 
    def status 
     @exception = env['action_dispatch.exception'] 
     @status = ActionDispatch::ExceptionWrapper.new(env, @exception).status_code 
     @response = ActionDispatch::ExceptionWrapper.rescue_responses[@exception.class.name] 
    end 
    end 
end 

Görünüm

# app/views/exception/show.html.erb 
<h1>404 error</h1> 

Bu çok basit versi - Eğer istersen daha fazlasını açıklayabilirim. (Tüm çevreyi render aksine)

Temel olarak, config.exceptions_app katman içine kanca gerekir, bunu controller#action kendi isteği göndermek için izin middleware yığınında herhangi istisna yakalayacaktır.

Eğer yorum yaparsanız, size daha fazla yardımcı olacağım!

+1

'sınıf ExceptionController

+0

raylar sürümü ile ilgisi yoktur. bu kongre. Denetleyici 'NameController' olarak adlandırılır ve daha sonra adı name_controller.rb' olarak adlandırılır. Rails bir 'NameController' arıyor. Eğer (o NameController bekler çünkü ancak bulamıyorum) bir 'açılamıyor autoload sürekli NameController' atmış Name' sadece' sınıf –

36

Raylar için 4.1 I like this answer, add an asset type daha iyi; ancak bunu denemedim. Raylar 4.0.8 günü, bu üç referanslar bana yardımcı:

  1. Dynamic error pages söz konusu ikinci referanstır. Bu benim için gayet iyi çalıştı.

  2. Custom error pages

    ilk referans veya tersi cribbed ama Capybara ile test hakkında bazı bilgiler ekleyerek ekstra mil gider olabilir.

  3. Test yapılandırmasını değiştirmek istemediğim için Capybara testini ben yapmadım; Ancak, bu istekleri bağımsız olarak test etmek için RSpec-Rails Request Specs beni engelledi ve doğru içeriği tamamlayıp döndürdüğünü görüyorlar.

    1. için, config/environments/production.rb

      # Route exceptions to the application router vs. default 
      config.exceptions_app = self.routes 
      
    2. Düzenle config/routes.rb yönlendirme yapılandırmasını aşağıdaki ayarı ekleyin: edilmesini gerektirmiyor

    Özetle üç referanslar tarafından öğretilen şeyin açıklamasıdır bir hata denetleyiciye hata sayfalarını doğrudan

    # error pages 
        %w(404 422 500 503).each do |code| 
        get code, :to => "errors#show", :code => code 
        end 
    

    güzergahın durum kodunun değeri olan bir parametre code ile errors kumandanın show eylem 404, 422, 500, ve 503 sayfa istekleri.

  4. app/controllers/errors_controller.rb, kontrolör oluşturun. İşte tüm içeriği:

    class ErrorsController < ApplicationController 
    
        def show 
        status_code = params[:code] || 500 
        flash.alert = "Status #{status_code}" 
        render status_code.to_s, status: status_code 
        end 
    
    end 
    

    Benim tercih sayfalarını kendileri oluşturma flash.alert

  5. bir durum mesajı ayarlamak oldu. Ben burada

    <p>Our apology. Your request caused an error.</p> 
    <%= render 'product_description' %> 
    

    app/views/errors/500.html.erb Yani bir kısmi işleyebilen görüyoruz olduğu .erb kullanın. Sayfa, app/views/layouts/application.html.erb arasındaki tüm düzensel kalıplarla veya yapılandırdığınız diğer tüm düzenlerle işlenir. Bu, flaştan durum mesajını görüntüleyen <div id='alert'><%= alert %></div>'u içerir.

  6. bir test dosyası, spec/requests/errors_request_spec.rb ekleyerek RSpec ile test edilmiştir. Flaş uyarı için

    require 'rails_helper' 
    
    RSpec.describe "errors", :type => :request do 
    
        it "displays the 500 page" do 
        get "/500" 
        assert_select 'div#alert', 'Status 500' 
        assert_select 'div[itemtype]' 
        end 
    
    end 
    

    ilk onaylama işlemi denetler: Burada 500 durum sayfasının bir test gösteren dosyanın içeriği kısaltılır. İkinci iddia, kısmi kontrol eder. Ben senin ikinci referansa düşünüyorum

+1

onu çağırırsanız varlık boru hattı çözümü ile tek bir sorun vardır. Her html dosyası sindirimle birleştirilir ve bu nedenle Dispatcher :: PublicExceptions öğesinden bulmak zorlaşır. İnsanlara burada bahsini denemelerini tavsiye ediyorum. – Kristoffer

İlgili konular