在rails中清除我的ajax表单

时间:2014-05-13 21:15:29

标签: javascript jquery ruby-on-rails ajax

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

contact.js.haml中的AJAX响应只是使用了闪存未被定义的无效数据。

/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()无效的屏幕截图

2 个答案:

答案 0 :(得分:0)

- if !@message.errors.any? 
  $(':input').not(':button, :submit, :hidden').val('') 
haml之前没有工作,所以我认为它不会,但确实如此。

答案 1 :(得分:0)

更清洁一点:只需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

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

总的来说:您的命名和分组通常非常混乱,而且结构不合理。你应该努力。