使用form_tag

时间:2016-09-29 21:26:32

标签: javascript jquery html ruby-on-rails validation

我正在视图页面上进行验证,因为我没有将它存储在数据库中。因此,我无法使用模型验证。我不得不资源使用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>

1 个答案:

答案 0 :(得分:1)

您使用javascript的全部原因是基于您不能使用模型的前提,因为它们不会被持久存储到数据库中,所以我觉得有必要给你一个Rails替代。您要做的是设置一个&#34;表单模型&#34;。这允许您使用所有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应用程序。您会注意到,一个模型可能必须处理不同页面上的许多不同形式,这些形式都需要不同数量的数据。在这一点上,处理一个模型的所有许多不同形式的所有验证都成了灾难。上述方法允许您在表单的基础上组织代码而不受限制。