2017-06-02 4 views
0

Ich habe Probleme mit der Methode "read_to": Wenn das Modell gespeichert wurde, wird es im JSON-Format korrekt zurückgegeben. Aber, wenn das Modell nicht gespeichert wurde, weil ein Fehler wie ActiveRecord :: RecordNotUnique, gibt Schienen eine andere Antwort, die es nicht ist: "Completed 500 Internal Server Error" und die Antwort zurückgegeben wird AJAX Fehler Funktion.Rails Ajax Anruf 500 interner Server Fehler

Meine Frage hier ist, wie kann ich die richtige Antwort senden, die in der Else-Anweisung, so dass ich den Benutzern die richtigen Fehlermeldungen anzeigen kann.

Ich bin im Entwicklungsmodus.

Ich ändere den Code ein wenig nur aus Gründen der Einfachheit.

Danke.

Controller:

def create 
    @distribuicao = DistribuicaoPorCargo.new(distribuicao_por_cargo_params) 
    respond_to do |format| 
    if @distribuicao.save 
     format.json { render json: @distribuicao.distribuicao, status: :created } 
    else 
     format.json { render json: @distribuicao.errors.full_messages, status: :unprocessable_entity } 
    end 
    end 
end 

Js:

$.ajax 
    url: '/distribuicao_por_cargos' 
    type: 'POST' 
    dataType: 'JSON' 
    data: { 
     data: JSON.stringify(data_send_to_server) 
    } 
    success: (data, textStatus, jqXHR) -> 
     console.log("AJAX Sucesss: #{textStatus}") 
    error: (jqXHR, textStatus, errorThrown) -> 
     console.log("AJAX Failed: #{textStatus}") 

log:

Started POST "/distribuicao_por_cargos" for 187.110.216.111 at 017-06-02 17:32:22 -0300 
Cannot render console from 187.110.216.111! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 
Processing by DistribuicaoPorCargosController#create as JSON 
Parameters: {"concurso_id"=>"2", "local_da_prova_id"=>"6", "tabela"=>"{\"cargo_id\":\"4\",\"quantidade_de_candidatos\":\"10\"},{\"cargo_id\":\"9\",\"quantidade_de_candidatos\":\"10\"},{\"cargo_id\":\"12}]"} 
Concurso Load (0.4ms) SELECT "concursos".* FROM "concursos" WHERE "concursos"."id" = $1 LIMIT $2 [["id", 2], ["LIMIT", 1]] 
LocalDaProva Load (0.2ms) SELECT "local_da_provas".* FROM "local_da_provas" WHERE "local_da_provas"."id" = $1 LIMIT $2 [["id", 6], ["LIMIT", 1]] 
(0.1ms) 
BEGIN 
LocalDaProva Load (0.3ms) SELECT "local_da_provas".* FROM "local_da_provas" WHERE "local_da_provas"."id" = $1 LIMIT $2 [["id", 6], ["LIMIT", 1]] SQL (1.5ms) 
INSERT INTO "distribuicao_por_cargos" ("created_at", "updated_at", "local_da_prova_id", "distribuicao") VALUES ($1, $2, $3, $4) RETURNING "id" [["created_at", 2017-06-02 20:32:23 UTC], ["updated_at", 2017-06-02 20:32:23 UTC], ["local_da_prova_id", 6], ["distribuicao", "[{\"cargo_id\":\"4\",\"quantidade_de_candidatos\":\"10\"},{\"cargo_id}]"]] 
(0.2ms) 
ROLLBACK 
Completed 500 Internal Server Error in 108ms (ActiveRecord: 6.3ms) 

ActiveRecord::RecordNotUnique (PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "index_distribuicao_por_cargos_on_local_da_prova_id" 
DETAIL: Key (local_da_prova_id)=(6) already exists. 
: INSERT INTO "distribuicao_por_cargos" ("created_at", "updated_at", "local_da_prova_id", "distribuicao") VALUES ($1, $2, $3, $4) RETURNING "id"): 

Antwort

1

Dies geschieht, weil Sie nicht in Ihrem Modell validieren, so dass, wenn es versucht, die erstellen es aufzuzeichnen, schlägt mit einer Ausnahme fehl.

Um dies zu vermeiden, könnten Sie in Ihrem Modell eine Validierung hinzufügen, die überprüft, ob die Spalte eindeutig ist. Wenn die Validierung erfolgreich ist, wird der Datensatz erstellt, andernfalls wird false zurückgegeben und eine Fehlermeldung erstellt (anstatt eine Ausnahme auszulösen).

Sie können dies tun uniqueness: true in Ihrem Modell Validierungen hinzufügen, wie folgt aus:

class DistribuicaoPorCargo < ApplicationRecord 
    # scopes, callbacks, ... 

    validates :local_da_prova_id, uniqueness: true 
    # more validations 
end 

Auf diese Weise wird Ihr Controller reagiert mit:

render json: @distribuicao.errors.full_messages, status: :unprocessable_entity 

und wird eine Ausnahme nicht erhöhen (die verhindern, dass Completed 500 Internal Server Error angezeigt wird).

+0

Schön! Ich habe nicht bemerkt, dass dieser Fehler (ActiveRecord :: RecordNotUnique) in der Datenbankebene war, deshalb hat die Anwendung sie nicht abgefangen. –

+0

@PedroGabrielLima Ja und mit der Modellüberprüfung werden Sie den Fehler vor dem Einfügen in die Datenbank abfangen und Ihr Controller wird die richtige Antwort senden; also sollte es das Problem lösen (und falls nicht, bitte vergiss die Antwort zu akzeptieren, indem du auf das Häkchen klickst). – Gerry

Verwandte Themen