2016-06-08 5 views
0

Я использую Rails 4.2.3 и свойство:: remote => true, чтобы отправить форму удаленно. Однако у меня возникают проблемы с отображением ошибок проверки. В мой контроллер у меня естьКак вернуть ошибки проверки в форме JSON из формы, которая отправляется удаленно?

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 

И в моем кофе сценарий, у меня есть

$(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); 

Но ни один из трех полей, «XHR, статус, ошибка» не содержит ошибок в формате JSON. Вывод инструкций console.log:

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 

Как передать их обратно с моего контроллера?

Спасибо, -

Edit: В ответ на ответ, я редактировал мой контроллер в порядке, установленном, и добавил это мой кофе сценарий ...

$(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); 

, но при подаче моя форма с ошибками, ни одна из перечисленных выше не вызвана. Я знаю, что есть ошибки, потому что я вижу (через отладку) предложение «else» вызываемого «if @ my_object.save».

+0

Это ошибка внутреннего сервера 500, из-за 'ArgumentError в MyObjectsController # create' –

ответ

1

Прежде всего, вам нужно исправить эту ошибку 500, я не принял ваш пример, но это пример.

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); 
    }) 
}) 

в контроллере, например, для мой контроллер 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 

Если вы хотите ajax:error обратного вызова для вашего еще блока, вам нужно будет предоставить с другим кодом состояния, как 400, 500. например, format.js { render json: { error: @bug.errors, success: false }, content_type: 'application/json', status: 500 }, хотя я бы не рекомендовал это, так как это неправильный способ сделать это. Ваш ajax:success позаботится об ошибках проверки, также, поскольку мы проходим success: false, мы можем проверить, есть ли ошибки проверки в js.

+0

Привет, я отредактировал свой quesiton, чтобы включить ваш код (я использую скрипт для кофе, где, как я думаю, у вас есть стриагат вверх по Javascript), но« ajax : failure "не вызвано при отправке моей формы с ошибками проверки. – Dave

+0

Вы добавили format.js в свой блок else – Saad

+0

Я забыл включить этот блок в вопрос, но я его отредактировал. Какое событие вызывается при наличии ошибок проверки? Это аякс: неудача? – Dave

Смежные вопросы