2015-11-12 30 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