2012-03-17 41 views
7

我在Rails(3.2.0)上運行Ruby(1.9.3),並且驗證虛擬屬性時出現問題。驗證Ruby on Rails中的虛擬屬性

我有一個Flight模型,代表一個航班,其中包含代表起飛和到達機場的屬性。

因爲選擇機場的select可能很大,所以我選擇了自動完成解決方案,該方案工作得很好。我使用的是before_validation回調適當填充機場的實際ID:

before_validation do 
    self.departure_airport = Airport.find_by_long_name(departure_airport_name) 
    self.arrival_airport = Airport.find_by_long_name(arrival_airport_name) 
end 

的問題,但是,當用戶輸入一個不存在於數據庫中的機場的名稱,提交失敗因爲任一機場的編號是nil。大。什麼是不是很大,但問題在於,這種驗證失敗不是形式體現,因爲從技術上說,這是另一個領域的投入:

validates :departure_airport, :arrival_airport presence: true 

attr_accessor :departure_airport_name, :arrival_airport_name 

<%= f.input :departure_airport_name %> 
<%= f.input :arrival_airport_name %> 

這甚至正確去的方式,改造機場的名稱成before_validation回調中的ID?如果是這樣,我怎樣才能得到驗證錯誤顯示在機場的虛擬名稱屬性?

回答

4

我認爲你正在用before_validation回調正確的方式。

您可以像驗證每個普通屬性一樣驗證虛擬屬性。所以你所需要的只是模型中的一些驗證。試試這個:

validates :departure_airport, presence: true 
validates :arrival_airport, presence: true 

這應該添加一個錯誤的對象錯誤,應該顯示錯誤在您的形式...

+0

感謝您的迅速反應!我已經對'departure_airport'和'arrival_airport'進行了驗證。問題在於這些不是表單中「輸入」字段所代表的字段。我不能簡單地驗證出席狀態,因爲當有人在其中輸入文本時,該字段存在,但實際的Airport對象將會丟失。 – Laurens 2012-03-17 11:15:51

+0

這就是爲什麼你註冊'before_validation'回調。當用戶輸入亂碼時,它不會找到機場,驗證將失敗。錯誤將被添加並顯示給用戶。也許你應該考慮添加一個自定義的錯誤按摩。 – klump 2012-03-17 11:21:12

+0

對不起我的壞。我不明白。也許你需要你自己的驗證方法。你可以用'self.errors.add(:fieldname,「message」)'向對象添加錯誤。如果您現在使用'departure_airport_name'作爲字段名並添加一條消息,它將顯示在'departure_airport_name'字段中。 – klump 2012-03-17 11:24:05