2015-11-12 29 views
0

我正在开发允许现场代理代表客户报告票证的Rails应用程序。我使用名为“提交”的模型捕获数据,其中代理可以输入客户的详细信息并为客户提交一张或多张票据。Rails表单 - 检查预先存在的数据并填充字段

我想确保如果客户端已经存在,则不会为同一客户端创建新记录。我还想确保,如果客户的姓名与先前存在的记录类似,那么客户不会混淆,例如:2名姓名为John Smith的人。

我目前的提交表单:

<%= form_for(@submission) do |f| %> 

    # some submission fields here ... 

    <h4>Client Details</h4> 
    <%= f.fields_for :client do |c| %> 
    <div class="row"> 
     <div class="field col-xs-6"> 
     <%= c.label :first_name %><br> 
     <%= c.text_field :first_name, class: 'form-control' %> 
     </div> 
     <div class="field col-xs-6"> 
     <%= c.label :last_name %><br> 
     <%= c.text_field :last_name, class: 'form-control' %> 
     </div> 
    </div> 

    # more client fields.... 

    <% end %> 

<% end %> 

我如何能增加一个功能检查现有当您填写字段匹配名字和姓氏的记录?另外,如何确保如果两个客户存在同名,那么这可以被识别出来?我可以使用电话号码作为唯一标识符吗?

我知道我的问题是有点含糊,但我不确定如何最好地解决这个问题(自动完成?也许有新的或现有的客户端选项的复选框?)

任何帮助将非常感激。

回答

1

您可能想要使用Rails验证来确保客户端的名字和姓氏不会重复。例如:

class Client < ActiveRecord::Base 
    validates :first_name, uniqueness: true 
    validates :last_name, uniqueness: true 
end 

但是,这将拒绝任何具有相同的名字,但不同的姓氏或其他情况。在这种情况下,您可能会搜索自定义验证方法:

class Client < ActiveRecord::Base 
    validate :same_full_name 

    def same_full_name 
    # or different logic/additional condition 
    if Client.exists?(first_name: first_name, last_name: last_name, phone_number: phone_number) 
     errors.add("Client with this name exists.") 
    end 
    end 
end 

这会在用户尝试提交表单时提示错误。当Rails验证失败时,它们将被重定向到此页面(假设应用了标准REST操作)并查看错误消息(如果视图中有任何闪存或错误消息)。

如果立即提示错误,您可能希望将JavaScript客户端与Rails验证集成,如client_side_validations宝石,或者使用jquery validation进行纯Javascript验证。

对于在评论中所述的问题:

如果客户端在数据库中不存在,我怎么能填充表单与此数据并保存提交使用相同的客户端?

这取决于网络流量,另一个解决方案可能是使用ajax调用控制器操作来检查客户端是否存在。如果是这样,那么你可以使用jQuery将返回的客户端数据(从控制器)填充到表单中,而不是进行验证。

+0

我正在更新答案。 – nayiaw

+0

谢谢nayiaw。这肯定会解决其中一个问题(确保客户端不会被保存两次)。 如果客户端已经存在于数据库中,如何使用这些数据填充表单并使用相同的客户端保存提交? – Craig

+0

更新了我的答案。 – nayiaw