2014-04-28 16 views
5

Oggi ho eseguito l'aggiornamento a Rails 4.1.0. La protezione CSRF (cross-site request forgery) ora copre anche le richieste GET con risposte JavaScript.DoubleRenderError in Rails 4.1 durante il salvataggio da InvalidCrossOriginRequest

Ho alcuni collegamenti GET remoti nell'app che vengono colpiti dai bot e lanciano ora l'eccezione ActionController :: InvalidCrossOriginRequest.

così ho aggiunto un'altra linea rescue_from a application_controller:

rescue_from ActionController::InvalidCrossOriginRequest, with: :render_400 

Ecco il metodo render_400:

def render_400 
    render(nothing: true, status: 400) and return 
end 

sto ancora ricevendo AbstractController :: DoubleRenderError anche se ho aggiunto and return come si può vedere sopra.

Si verifica solo con l'eccezione ActionController :: InvalidCrossOriginRequest. Altri come per es. ActionController :: BadRequest e non risultante in AbstractController :: DoubleRenderError.

risposta

7

Il motivo sottostante è che una parte di response_body viene assegnata prima che venga generato l'errore.

È possibile provare a cancellare il corpo della risposta prima di chiamare render nel gestore di eccezioni.

def render_400 
    # Clear the previous response body to avoid a DoubleRenderError 
    # when redirecting or rendering another view 
    self.response_body = nil 

    render(nothing: true, status: 400) 
end 
+0

Ho riscontrato un problema con Rails 5.1 e questa soluzione non funziona: / –

Problemi correlati