2014-12-08 11 views
8

C'è il seguente codice:Come rilevare le eccezioni nelle azioni del controllore in modo corretto?

def index 
    @posts = User.find_by(login: params[:user_id]).posts 
end 

Come si può vedere questo codice può generare un'eccezione se non c'è alcun utente con un po 'di accesso (un'eccezione di puntatore nullo). Come posso rilevare questa eccezione e gestirla correttamente? So come catturare le eccezioni in Ruby, ma voglio sapere come fare in un buon stile di Rails. Lo stesso problema può verificarsi in diversi controller: potrebbe essere necessario creare un wrapper di azione, rilevare l'eccezione e rendere l'errore 500?

+1

è possibile usare [ 'rescue_from'] (http://edgeapi.rubyonrails.org/classes/ActiveSupport/Rescuable/ClassMethods.html) –

+1

buona stile di rotaie non è quello di consentire l'eccezione (almeno quella) per essere sollevato. quindi puoi usare il modulo anither: 'posts = User.where (login: params [: user_id]). first.try (: posts)' –

+1

E le eccezioni di integrazione o qualcos'altro? Questo dovrebbe essere fatto in BaseController, o dovresti avvolgere ogni azione nei blocchi try-catch (le rotaie iniziano - rescue)? – Miknash

risposta

8

Il modo più semplice è quello di utilizzare di ApplicationController rescue_from:

class ApplicationController < ActionController::Base 
    rescue_from ActiveRecord::RecordNotFound, with: :record_not_found 

    private 

    def record_not_found 
    render 'my/custom/template', status: 404 
    end 
end 
Problemi correlati