2011-09-23 54 views
1

我有一個表,並對錶中的唯一性設置進行驗證。例如。在數據庫中驗證軌道模型

創建表的帖子( ID INT UNSIGNED AUTO_INCREMENT PRIMARY KEY UNIQUE, 標題爲varchar(255)獨特的, 內容文本 );

這裏標題是獨一無二的。還需要告知模型類有關這種獨特性嗎?如果不是當我插入重複的標題,它給我錯誤。我如何捕捉到這一點。目前,軌道顯示我的回溯,我不能把我自己的錯誤信息

def create 
    @f = Post.new(params[:post]) 
    if @f.save 
    redirect_to posts_path 
    else 
    @flash['message'] = "Duplicated title" 
    render :action=>'new' 
    end 
end 

我不是被重定向到新的,而是表現出很大的回溯。

+0

作爲一個註釋改變@flash閃爍,並提供更深入的形式本身的錯誤,說標題被重複是不好的,因爲模型可能已經改變 - 在表單本身嘗試一個內聯錯誤。 –

回答

2

使用validates_uniqueness_of驗證。 「創建記錄時,將執行檢查以確保數據庫中不存在指定屬性(映射到列)的給定值的記錄」

0

是的,你做其他答案中指出,答案是validate_uniqueness_of - http://ar.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#M000086。請注意,即使你有你的模型驗證的競爭條件確實存在,其中軌道可嘗試做有作爲一個獨特的記錄已經在表中

當創建記錄的兩個插入不知道,一查是執行以確保數據庫中不存在 記錄,該記錄具有指定的 屬性(映射到列)的給定值。更新記錄時,將進行相同的檢查,但不考慮記錄本身。

由於此檢查是在數據庫之外執行的,所以仍有 重複值將插入到兩個並行的 事務中。爲了保證這一點,你應該在現場創建一個獨特的 索引。有關更多信息,請參閱add_index。

因此,通過在數據庫上創建唯一索引來完成的工作是正確的,儘管您可能會在異常日誌中獲取數據庫驅動程序異常。有一些解決方法,比如檢測插入是否發生(通過雙擊)。

+0

我的問題在這裏。如果發生數據庫錯誤,即使我在模型中進行驗證之後,我需要捕獲並顯示它們,而不是將堆棧跟蹤轉儲給用戶。通過使用開始和營救 – kiran

+0

validates_uniqueness_of對於99%的情況來說足以滿足異常情況。然而,它可能發生在短時間內發生兩次點擊,所以用戶點擊插入一次,然後再次點擊非常快。 rails應用程序在表中選擇*,其中title ='whatever',並且不會爲第一次點擊找到任何內容,然後再次進行第二次點擊。兩次點擊都會經歷插入記錄的過程,第一次點擊成功,而第二次點擊由於唯一約束而無法插入。 –

+0

最後,我知道唯一的密鑰數據庫異常被集中到捕獲所有數據庫異常中,所以爲了正確捕獲它,您必須進行救援,然後查看消息以查看它是否違反約束(數據庫特定和毛病),並且如果它是錯誤的話,如果它是一個不同的例外,則重新拋出錯誤。 –

0

Michael Hartl Rails教程涵蓋唯一性驗證(請參閱「電子郵件」字段)here。看來完整的唯一性解決方案是:

  1. :uniqueness驗證添加到模型中。
  2. 使用遷移將唯一索引添加到數據庫。
  3. 捕獲控制器中的數據庫錯誤。邁克爾的例子是Insoshi people_controller - 搜索rescue ActiveRecord::StatementInvalid陳述。

Re。#3,它看起來像邁克爾只是重定向到任何DB語句異常的主頁,因此它不像@Ransom Briggs所提出的解析那樣複雜(或不準確),但如果像@Omar Qureshi所說的那樣, ,唯一性約束涵蓋了99%的案例。