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?如果是這樣,我怎樣才能得到驗證錯誤顯示在機場的虛擬名稱屬性?
感謝您的迅速反應!我已經對'departure_airport'和'arrival_airport'進行了驗證。問題在於這些不是表單中「輸入」字段所代表的字段。我不能簡單地驗證出席狀態,因爲當有人在其中輸入文本時,該字段存在,但實際的Airport對象將會丟失。 – Laurens 2012-03-17 11:15:51
這就是爲什麼你註冊'before_validation'回調。當用戶輸入亂碼時,它不會找到機場,驗證將失敗。錯誤將被添加並顯示給用戶。也許你應該考慮添加一個自定義的錯誤按摩。 – klump 2012-03-17 11:21:12
對不起我的壞。我不明白。也許你需要你自己的驗證方法。你可以用'self.errors.add(:fieldname,「message」)'向對象添加錯誤。如果您現在使用'departure_airport_name'作爲字段名並添加一條消息,它將顯示在'departure_airport_name'字段中。 – klump 2012-03-17 11:24:05