如何从事件ajax的响应中获取数据:Rails 5.1中的错误

时间:2017-05-07 03:10:27

标签: javascript jquery ruby-on-rails ajax

我在Rails中构建一个表单。我想通过ajax提交它,所以我设置了remote: true

<%= form_for @post, html: { multipart: true }, remote: true  do |f| %>
    ...
<%= end %>

在我的控制器中:

def create
    @post = Post.new(post_param)

    respond_to do |format|
       if @post.save
          format.html { redirect_to @post, notice: 'Post was successfully created.' }
          format.json { render :show, status: :created, location: @post }
       else
          format.html { render json: @post.errors, status: 400 }
          format.json { render json: @post.errors, status: 400 }
      end
    end
end

在视图中的表单

$('#new_post').on('ajax:success', function(data) {
    console.log(data);
}).on('ajax:error', function(evt, xhr, status, error) {
    console.log(xhr);
});

但是在事件'ajax:error'中,我无法解析获取有关post的验证错误的数据。所有参数'xhr','status','error'都等于未定义。

如何解析'ajax:error'中的响应以获取有关验证错误的数据?

1 个答案:

答案 0 :(得分:4)

Rails 5.1引入了// ... .on('ajax:error', function(event) { var detail = event.detail; var data = detail[0], status = detail[1], xhr = detail[2]; // ... }); ,它改变了这些事件处理程序的参数。以下应该有效:

var modals = $('.overview > .modal');

for(var i = 0; i < modals.length; i+=3) {
  $('.overview > div[class="item n' + (i+2) + '"]').after("<div class='row row" + i + "'></div>")
  $('.row' + i).html($('div[class="modal n' + i +'"], div[class="modal n' + (i+1) +'"], div[class="modal n' + (i+2) +'"]').clone());
}

来源:http://edgeguides.rubyonrails.org/working_with_javascript_in_rails.html#rails-ujs-event-handlers