我正在使用rails 2.3。
如何验证使用文本框输入的belongs_to关联字段?例如博客文章属于一个类别,但它不是使用选择输入的,而是作为文本框中的类别名称(让我们假设是唯一的)输入。
可能的错误是:格式错误,DB中没有此类别。
如果我将字符串直接分配给关联,则会使用AssociationTypeMismatch将其错误输出,因此我无法分配相同的属性,然后使用自定义的before_validate方法。
如果我在控制器中进行转换工作并添加到模型的错误集合中,它仍然保存(我认为错误集合在验证开始之前就已清除)。
我该怎么做呢还要使用标准的错误集合?
答案 0 :(得分: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