验证Ruby on Rails中的虚拟属性

时间:2012-03-17 09:47:52

标签: ruby-on-rails

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

我有一个代表航班的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。大。然而,有什么不好的是,这个验证失败没有反映在表单上,​​因为从技术上讲,它是另一个字段的输入:

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?如果是这样,我怎样才能将验证错误显示在机场的虚拟名称属性上?

1 个答案:

答案 0 :(得分:4)

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

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

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

这会给对象错误添加错误,错误应该显示在表单中......