2011-04-13 43 views
0

我正在使用rails 2.3。如何驗證在文本框中輸入的導軌關聯模型

如何驗證使用文本框輸入的belongs_to關聯字段?例如一個博客文章belongs_to一個類別,但它不是使用select輸入的,而是作爲文本框中的類別名稱(假設是唯一的)。

可能的錯誤是:格式錯誤,數據庫中沒有這樣的類別。

如果我直接給該關聯分配一個字符串,它將與一個AssociationTypeMismatch出錯,因此我不能分配給相同的屬性,然後使用自定義的before_validate方法。

如果我在控制器中進行轉換工作並添加到模型的錯誤集合中,它仍然保存(我認爲在驗證開始之前清除錯誤集合)。

我應該怎麼做還有使用標準錯誤集合?

+0

什麼是您的類別字段的數據類型? – 2011-04-13 12:26:57

+0

@Michael這個字段是一個引用(整數),輸入是一個字符串。 – lmz 2011-04-14 04:50:56

回答

0

您可能想考慮使用帶有JavaScript自動完成功能的虛擬文本框。在該關聯的ID的表單中放置一個隱藏字段。當JS返回匹配列表時,包含ID,並在選擇項目時填充隱藏的ID字段。

否則,這可能會有所幫助。請注意,這是未經測試的代碼。

# Assumed that "Obj" is the class of your belongs_to association 

attr_accessor :obj_name 
def obj_name= value 
    self.obj = Obj.find_by_name(params[:obj_name]) 
end 

validate :validate_obj 
def validate_obj 
    # If there's no obj, report an error on our pseudo-field 
    return if self.obj.present? 
    return if self.obj_name.blank? # Allow empty object if blank name was specified 
    error.add(:obj_name, "does not appear to be a valid obj name") 
end 
+0

這是有道理的,除了「no object」/ nil也是一個有效的值,所以存在?沒有幫助。我開始認爲我在這裏需要另一個屬性(使用attr_accessor創建的屬性是否工作?)來存儲用戶輸入的字符串,並且僅在驗證中解析對象。 – lmz 2011-04-14 04:55:42

+0

使用attr_accessor是一種很好的方法,像get_id_from_name一樣覆蓋setter來設置真實屬性。進行編輯以允許空值。 – aceofspades 2011-04-14 16:24:02