我正在尝试清除表单,如果它已提交,但问题是我的控制器处理所有验证。
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()无效的屏幕截图
答案 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
所以在渲染之前,先从一条新的新消息开始,然后你的表单就可以了:)
总的来说:您的命名和分组通常非常混乱,而且结构不合理。你应该努力。