2016-06-08 4 views
0

Ich verwende Rails 4.2.3 und die Eigenschaft ": remote => true", um ein Formular remote zu senden. Ich habe jedoch Probleme beim Anzeigen der Validierungsfehler, die zurückkommen. In meinem Controller habe ichWie gebe ich Validierungsfehler im JSON-Formular von einem Formular zurück, das remote übermittelt wird?

def create 
    @my_object = MyObject.new(my_object_params) 
    @current_user = User.find(session["user_id"]) 
    @my_object.user = @current_user 
    @date = Date.strptime(my_object_params[:day], "%m/%d/%Y") 
    @my_object.day = @date 
    respond_to do |format| 
     if @my_object.save 
     flash[:notice] = 'Saved successfully' 
     format.html { redirect_to controller: "users", action: "index", notice: 'Saved successfully.' } 
     format.js { render js: "window.location='/users'" } 
     else 
     format.html { render action: "index" } 
     format.json { render json: @my_object.errors, status: :unprocessable_entity } 
     format.js { render json: { error: @my_object.errors, success: false }, content_type: 'application/json' } 
     end 
    end 
    end 

Und in meinem Kaffee-Skript, ich habe

$(document).ready (data) -> 
    $("#add_form").bind "ajax:error", (xhr, status, error) -> 
    console.log(xhr) 
    console.log(status) 
    console.log(error) 
    render_form_errors(xhr, error) 
    #Give an alert message 
    $("#add_form").bind "ajax:before", (evt, data, status, xhr) -> 
    hrs = $('#my_object_hour').val(); 
    min = $('#my_object_minute').val(); 
    sec = $('#my_object_second').val(); 
    $('#my_object_my_object_times_attributes_0_time_in_ms').val((hrs * 60 * 60 + min * 60 + sec) * 1000); 

Aber keines der drei Felder „xhr, Status, Fehler“ enthält die JSON Fehler. Die Ausgabe der console.log-Anweisungen lautet

j…y.Event {type: "ajax:error", timeStamp: 1465418664628, jQuery112103593207809583596: true, isTrigger: 3, namespace: ""…} 
users.self-a27ba2c….js?body=1:13 Object {readyState: 4, responseText: "ArgumentError in MyObjectsController#create↵↵invalid d…VER_PROTOCOL: "HTTP/1.1"↵↵Response headers↵None↵↵", status: 500, statusText: "Internal Server Error"} 
users.self-a27ba2c….js?body=1:14 error 

Wie übertrage ich diese von meinem Controller zurück?

Danke, -

Edit: Als Reaktion auf die Antwort, ich bearbeiten mein Controller in der Art und Weise angegeben wird, und fügte hinzu, dieses Skript zu meinem Kaffee ...

$(document).ready (data) -> 
    $("#add_form").bind "ajax:failure", (e, xhr, status, error) -> 
    console.log('error'); 
    console.log(e); 
    console.log(xhr); 
    console.log(status); 
    console.log(error); 
    render_form_errors(xhr, error) 
    $("#add_form").bind "ajax:error", (xhr, status, error) -> 
    console.log(xhr) 
    console.log(status) 
    console.log(error) 
    render_form_errors(xhr, error) 
    #Give an alert message 
    $("#add_form").bind "ajax:before", (evt, data, status, xhr) -> 
    hrs = $('#my_object_hour').val(); 
    min = $('#my_object_minute').val(); 
    sec = $('#my_object_second').val(); 
    hrs_in_ms = hrs * 60 * 60 * 1000 
    min_in_ms = min * 60 * 1000 
    sec_in_ms = sec * 1000 
    ms = hrs_in_ms + min_in_ms + sec_in_ms 
    alert(ms) 
    $('#my_object_my_object_times_attributes_0_time_in_ms').val(ms); 

aber bei der Einreichung Meine Form mit Fehlern, die keine der oben genannten wird aufgerufen. Ich weiß, dass es Fehler gibt, weil ich (durch Debugging) die "else" -Klausel des "if @ my_object.save" sehe.

+0

Das ist ein 500 interner Server Fehler, wegen der 'ArgumentError in MyObjectsController # create' –

Antwort

1

Zuerst müssen Sie diesen 500 Fehler beheben, ich habe Ihr Beispiel nicht genommen, aber das ist ein grobes Beispiel.

bugs.js

$(document).ready(function() { 
    console.log('hiii'); 
    $('#new_bug') 

    .on('ajax:success', function(e, data, status, xhr) { 
    console.log('success'); 
    console.log(e); 
    console.log(data); 
    console.log(status); 
    console.log(xhr); 
    }) 

    .on('ajax:error', function(e, xhr, status, error) { 
    console.log('error'); 
    console.log(e); 
    console.log(xhr); 
    console.log(status); 
    console.log(error); 
    }) 
}) 

in Ihrem Controller, für z.B. mein Controller ist bugs_controller.js

def create 
    @bug = Bug.new(bug_params) 

    respond_to do |format| 
     if @bug.save 
     format.html { redirect_to @bug, notice: 'Bug was successfully created.' } 
     format.json { render :show, status: :created, location: @bug } 
     format.js { render json: { success: true, bug: @bug.to_json }, content_type: 'application/json' } 
     else 
     format.html { render :new } 
     format.json { render json: @bug.errors, status: :unprocessable_entity } 
     format.js { render json: { error: @bug.errors, success: false }, content_type: 'application/json' } 
     end 
    end 
    end 

Wenn Sie ajax:error Rückruf für Ihren anderen Block wollen, müssen Sie mit einem anderen Statuscode wie 400, 500. Beispiel bereitzustellen format.js { render json: { error: @bug.errors, success: false }, content_type: 'application/json', status: 500 }, obwohl ich das nicht wirklich empfehlen würde, da dies nicht der richtige Weg ist. Ihr ajax:success wird sich um Validierungsfehler kümmern, auch nachdem wir success: false übergeben haben, können wir überprüfen, ob es Validierungsfehler in js gibt.

+0

Hallo, Ich bearbeitet meine Frage, um Ihren Code (Ich benutze ein Kaffee-Skript, wo ich glaube, dass Sie Javascript striaght), aber die" Ajax : failure "Methode wird nicht bei der Übermittlung meines Formulars mit Validierungsfehlern aufgerufen. – Dave

+0

haben Sie format.js in Ihrem else Block – Saad

+0

hinzugefügt Ich habe vergessen, diesen Block in die Frage aufzunehmen, aber ich habe es bearbeitet. Welches Ereignis wird aufgerufen, wenn Validierungsfehler vorliegen? Ist es Ajax: Versagen? – Dave

Verwandte Themen