验证Ruby on Rails中的虚拟属性

Lau*_*ens 7 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
Run Code Online (Sandbox Code Playgroud)

但问题是,当用户输入数据库中不存在的机场名称时,提交失败,因为任一机场的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 %>
Run Code Online (Sandbox Code Playgroud)

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

klu*_*ump 4

我认为你的回调方式是正确的before_validation

您可以像验证每个普通属性一样验证虚拟属性。因此,您所需要的只是在模型中进行一些验证。尝试这个:

validates :departure_airport, presence: true
validates :arrival_airport, presence: true
Run Code Online (Sandbox Code Playgroud)

这应该向对象错误添加一个错误,并且该错误应该显示在您的表单中...