【问题标题】:How to validate form after AJAX submit?AJAX提交后如何验证表单?
【发布时间】:2014-11-01 23:00:37
【问题描述】:

我有一个通过 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 

但是现在我有这样的情况:

  # 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

我创建了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 %>

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

【问题讨论】:

    标签: javascript jquery ruby-on-rails ajax jquery-file-upload


    【解决方案1】:

    在您的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 %>
    

    这将与错误一起再次呈现整个表单。如果您不想再次呈现完整的表单,您可以只对错误 div 执行相同的操作。

    【讨论】:

      【解决方案2】:

      您可以在成功和失败两种情况下渲染 create.js.erb,并在您的 create.js.erb 文件中检查 @cat.errors.any?如果是这样,您可以编写一些 jquery 并在 html 中注入错误,如果不是这样,则可以像以前一样处理成功场景。

      示例代码来说明我的意思:

      def create
        @cat = Cat.new(cat_params)
      
        respond_to do |format|
         @error = @cat.save
         // or you can use if if you need more in success case to be done before rendering
         format.js {}
        end
      end
      

      在你的 create.js.erb ::

      <% if @error %>
        // loop over errors like your working code in the case of html request
      <% else %>
        // success scenario
      <% end %>
      

      【讨论】:

      • 谢谢!你能告诉我一个小提示如何在 html 中注入错误吗?
      • 好的,你知道如何使用 jQuery 吗? -- 不管最简单的方法是把你上面的代码最后一块 -- 失败案例 -- 在部分文件中的问题中,然后写 $("#id_of_error_div").html('')
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-25
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 2011-12-15
      • 1970-01-01
      相关资源
      最近更新 更多