繁体   English   中英

使用JavaScript验证使用form_tag的输入字段时,提交按钮停止在rails中工作

[英]Submit button stops working in rails when using javascript to validate input fields when using form_tag

我正在视图页面上进行验证,因为我没有将其存储在数据库中。 因此,我不能为此使用模型验证。 我不得不使用JavaScript来检查验证,以确保用户没有提交错误的值或提交必需的空字段。 这确实可以防止用户提交错误的输入,但是在弹出错误警报框后,由于某种原因它会禁用“提交”按钮,并且用户无法修复其错误并尝试再次提交。

feedback.html.erb

<script>
  function validateForm() {

    if (document.forms["myForm"]["name"].value == null || document.forms["myForm"]["name"].value == "") {
      alert("Name must be filled out");
      return false;
    }
    if (document.forms["myForm"]["message"].value == null || document.forms["myForm"]["message"].value == "") {
      alert("Message must be filled out");
      return false;
    }
    var x = document.forms["myForm"]["email"].value;
    var atpos = x.indexOf("@");
    var dotpos = x.lastIndexOf(".");
    if (atpos < 1 || dotpos < atpos+2 || dotpos+2 >= x.length) {
      alert("Not a valid e-mail address");
      return false;
    }
  }
</script>
<div class="container">
  <div class="container-content">
    <%= form_tag send_feedback_forms_path, name:'myForm', onsubmit:'return validateForm()' do %>
        <%= label_tag 'name', 'Name:', class: 'control-label' %>
        <%= text_field_tag 'name', nil, placeholder: 'Enter Your Name', class:'form-control' %>
        <%= label_tag 'text', 'Email:', class: 'control-label'%>
        <%= email_field_tag 'email', nil, placeholder: 'Enter Your Email', class:'form-control' %>
        <%= label_tag 'phone', 'Phone:', class: 'control-label'%> <span style="font-size: small; color: red">(optional*)</span>
        <%= phone_field_tag 'phone', nil, placeholder: 'Enter Your Phone Number', class:'form-control' %>
        <%= label_tag 'message', 'Message:', class: 'control-label' %>
        <%= text_area_tag 'message', nil, placeholder: 'Enter Your Message', class:'form-control' %><br>
        <%= submit_tag 'Submit', class: 'btn-primary' %>
    <% end %>
  </div>
</div>

您使用javascript的全部原因是基于您不能使用Models的前提,因为Models不能持久化到数据库中,因此我不得不为您提供Rails替代方案。 您要做的是设置一个“表单模型”。 这使您可以使用所有Rails魔术,而无需表支持的任何数据。 所需要做的就是创建一个类,添加一些虚拟属性,然后包括一些Rails模块,您就可以开始了。 下面的例子:

#app/models/new_user.rb
class NewUser
  include ActiveModel::Model  #This gives you validations and all the rails magic a standard table backed model would
  attr_accessor :email   #This gives you read&write methods for your virtual attribute
  attr_accessor :username

  validates :username, :email, presence: true  #standard rails validations

  def initialize(params={})
      self.username = params[:username]
      self.email = params[:email]
  end
end

现在,在您的控制器中,您需要实例化视图的对象:

    def new
       @new_user = NewUser.new
    end

然后,在表单提交的操作中,由于您不保留任何数据,因此只需要检查其是否有效即可:

def create
  @new_user = NewUser.new(email: params[new_user][:email], username: params[:new_user][:username])
  if @new_user.valid?
           #passed validation so do whatever
  else
     #flash some errors etc
  end
end

随着您继续开发更大的Rails应用程序。 您会注意到,一个模型可能必须在不同的页面上处理许多不同的形式,而所有这些形式都需要不同的数据量。 在这一点上,为一个模型处理所有许多不同形式的所有验证就变成了灾难。 上面的方法将使您可以逐个表单地组织代码,而不受限制。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM