validationRuby on Rails中的虚拟属性

我在Rails(3.2.0)上运行Ruby(1.9.3)并且在validation虚拟属性方面存在问题。

我有一个代表航class的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 

但问题是,当用户输入数据库中不存在的机场名称时,提交失败,因为任一机场的ID都是nil 。 大。 然而,有什么不好的是,这个validation失败没有反映在表单上,​​因为从技术上讲,它是另一个字段的输入:

 validates :departure_airport, :arrival_airport presence: true attr_accessor :departure_airport_name, :arrival_airport_name   

这甚至是正确进行的方式,将机场名称转换为before_validation回调中的ID? 如果是这样,我怎样才能将validation错误显示在机场的虚拟名称属性上?

我认为你使用before_validation回调正确的方式。

您可以像每个普通属性一样validation虚拟属性。 所以你需要的只是模型中的一些validation。 试试这个:

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

这应该为对象错误添加错误,错误应该显示在表单中…