【问题标题】:Clearing my ajax form in rails在rails中清除我的ajax表单
【发布时间】:2023-03-03 13:33:01
【问题描述】:

我正在尝试清除提交的表单,但问题是我的控制器处理了所有验证。

contact.js.haml 中的 AJAX 响应只是利用了无效数据时未定义的 flash。

/contact.js.haml
$("#new_message").replaceWith("#{j(render partial:'contact_mailer/contact_me', locals: {object: @message, notice: @notice} )}")

控制器在需要时设置通知

class MessagesController < ApplicationController
  def contact
    @message = Message.new(params[:message])
    respond_to do |format|
      if @message.valid?
        flash.now[:notice] = 'Message was sent successfully.'
        ContactMailer.contact_me(@message)
        format.html { redirect_to contact_path, notice: 'Message was sent successfully.' }
        format.js                                                                                                                                                                                                                                                                                                                                                   
      else
        format.html { redirect_to contact_path }
        format.js 
      end
    end
  end
end

问题在于消息发送成功,表单仍然有相同的数据,允许用户发送垃圾邮件

我知道这可以通过 JSON 或 XML 发送数据来解决,但是有没有办法!

*编辑reset()不工作的截图

【问题讨论】:

    标签: javascript jquery ruby-on-rails ajax


    【解决方案1】:
    - if !@message.errors.any? 
      $(':input').not(':button, :submit, :hidden').val('') 
    

    haml 之前没有工作,所以我认为它不会,但它确实有效。

    【讨论】:

      【解决方案2】:

      更简洁一点:只需 reset 表单(一个普通的 javascript 函数)。

      简而言之:

      $('form')[0].reset
      

      这会重置页面上的第一个表单。

      但是,请参阅此答案:How come form.reset() doesn't work after postback on this page? 它会将表单重置为收到的值。然后你从服务器发送它,带有值!!!!

      所以修复很简单,在你的MessagesController 中写

      def contact
        @message = Message.new(params[:message])
        respond_to do |format|
          if @message.valid?
            flash.now[:notice] = 'Message was sent successfully.'
            ContactMailer.contact_me(@message)
            @message = Message.new
            format.html { redirect_to contact_path, notice: 'Message was sent successfully.' }
            format.js                                                                                                                                                                                                                                                                                                                                                     
          else
            format.html { redirect_to contact_path }
            format.js 
          end
        end
      end
      

      所以在渲染之前,从一条新的消息开始,你的表单就可以了:)

      一般来说:您的命名和分组通常非常混乱,而且不是很有条理。你应该努力。

      【讨论】:

      • 奇怪的是,由于某种原因,这并不总是有效,请参阅上面的屏幕截图
      • 你确定id是new_message吗?因为当你在编辑时它会变成edit_message(并且错误表明id为new_message的表单没有找到)。你总是可以分配一个班级,或者如果只有一个表格,就使用$('form')
      • 是的,我敢肯定,在 ajax 调用之后,即使使用 $('form') 测试多次,.reset 也不再起作用
      • $('form')[0] 已定义?它是唯一的形式? $('form').length() 应该是 1?否则你可能会重置错误的表格? (或隐藏形式?)。只是猜测,没有任何代码有点难以帮助/告诉。 replaceWith 通常不会留下任何悬空形式,但可以轻松更改 id(因为它替换了完整的 div)。
      • 我不太确定错误是什么。长度为 1 形式 [0] 定义。如果你不想看到代码,Git 是github.com/Snowfiring/Mika。我在控制台试了一下
      猜你喜欢
      • 2016-12-07
      • 2014-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      • 1970-01-01
      相关资源
      最近更新 更多