Rails表单 - 检查预先存在的数据并填充字段

时间:2015-11-12 13:19:14

标签: ruby-on-rails forms activerecord autocomplete

我正在开发一个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 %>

如何在填写字段时添加一个函数来检查与名字和姓氏匹配的现有记录?此外,如何确保如果2个客户端具有相同的名称,那么可以识别这个?我可以使用电话号码作为唯一标识符吗?

我知道我的问题有点模糊,但我不确定如何最好地解决这个问题(自动完成?可能是一个复选框,可以为新客户或现有客户提供选项?)

非常感谢任何帮助。

1 个答案:

答案 0 :(得分: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 gem,或使用jquery validation进行纯Javascript验证。

对于评论中陈述的问题:

  

如果数据库中已存在客户端,如何使用此数据填充表单并使用同一客户端保存提交?

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