如何在AJAX提交后验证表单?

Bos*_*ets 0 javascript ajax jquery ruby-on-rails jquery-file-upload

我有一个表单,我通过AJAX提交,所以服务器的预期响应格式是javascript.问题是我无法像这样进行验证工作.通常我会这样做:

  # POST /cats
  # POST /cats.json
  def create
    @cat = Cat.new(cat_params)

    respond_to do |format|
      if @cat.save
        format.html { redirect_to @cat, notice: 'Cat was successfully created.' }
        format.json { render action: 'show', status: :created, location: @cat }
      else
        format.html { render action: 'new' }
        format.json { render json: @cat.errors, status: :unprocessable_entity }
      end
    end
  end 
Run Code Online (Sandbox Code Playgroud)

但现在我有这样的情况:

  # POST /cats
  # POST /cats.json
  def create
    @cat = Cat.new(cat_params)

    respond_to do |format|
      if @cat.save
        format.js { }
      else
        format.js { ????? }
      end
    end
  end
Run Code Online (Sandbox Code Playgroud)

create.js.erb如果保存了新对象,我创建了哪些可以满足我所需要的一切但如果没有保存对象,我不知道如何处理验证显示.在我的表单中,如果我不使用AJAX,我可以使用它:

  <% if @cat.errors.any? %>
    <div id="error_explanation">
      <ul>
      <% @cat.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>
Run Code Online (Sandbox Code Playgroud)

我能做什么?我正在使用Rails 4.

moh*_*a27 5

在你的作品中create.js.erb你可以再次渲染表格unless @cat.persisted?.

  1. 将表单改为另一部分,例如'_form.html.erb'.

  2. 如果您的表单位于ID为"my_form_div"的div中,

create.js.erb将是

<%  if @cat.persisted? %>
  # code for success save
<% else %>
  $('#my_form_div').html('<%= escape_javascript(render('form')) %>');
<% end %>
Run Code Online (Sandbox Code Playgroud)

这将再次呈现整个表单以及错误.如果您不想再次呈现完整表单,则只能对错误div执行相同操作.