行动前的铁路验证

时间:2016-03-07 20:06:30

标签: ruby-on-rails validation rails-activerecord

以下是我的应用中发生的情况:

  • 客户输入电话号码
  • 在客户模型中搜索电话号码以查看其是否存在
  • 如果确实存在,请转到客户展示页
  • 如果不存在,请转到客户新页面以创建新客户

根据我的理解,模型验证适用于输入/编辑/删除到数据库中的数据。

但是,如何在数据库中进行任何搜索之前检查(使用验证)?如果不正确(例如:使用字母而不是电话号码的数字),那么会显示错误。

我正在实施html表单输入选项,以防止有人在电话号码输入框中输入字母,如下所示:

 <%= form_tag(new_customer_path, method: :get) do %>
   <%= telephone_field_tag :phone, nil, placeholder: "Phone Number", required: true, pattern: "[0-9]{10}", title: "Number must be 10 digits", maxlength: "10", class: "input-lg" %>
   <%= submit_tag "Enter", class: "btn btn-primary btn-lg" %>
 <% end %>

然而,我的表格变得越来越大,因为我会在所有内容(手机,邮政编码,电子邮件等)上放置html表格输入框选项。

什么是更合适的“Rails”方式?使用活动记录验证来显示错误,或提供html表单输入选项以预先验证数据?或者它是两者的组合(最大安全?客户端和数据库之前)?

模型

class Customer < ActiveRecord::Base
  validates_presence_of :first_name, :last_name, :phone, :email, :zip_code
  validates_uniqueness_of :phone, :email
  validates :phone, :zip_code, :numericality => {:only_integer => true}
  validates_length_of :phone, is: 10
  validates_length_of :zip_code, is: 5
end

控制器

def new
   if @customer = Customer.find_by(phone: params[:phone])
    flash[:success] = "Welcome back"         
    redirect_to @customer
  else
    @customer = Customer.new(phone: params[:phone])
    flash.now[:warning] = "Customer not found, please sign up!"
  end
end

错误消息部分

<% flash.each do |key, value| %>
  <div class="alert alert-<%= key %>">
    <a href="#" data-dismiss="alert" class="close">×</a>
      <ul>
        <li>
          <p><%= value %></p>
        </li>
      </ul>
  </div>
<% end %>

2 个答案:

答案 0 :(得分:0)

rails验证可能已经足够好但如果你担心它,你可以在客户端添加javascript验证。如果您想在客户端进行表单验证,或者您可以编写自己的插件,可以使用多个插件。这可能会有所帮助:http://www.tutorialspoint.com/javascript/javascript_form_validations.htm

答案 1 :(得分:0)

只需使用JavaScript和HTML添加前端验证即可。你的Rails验证看起来很好。

Html:required属性。

Jquery:查看此链接 - http://jqueryvalidation.org/