我在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?如果是这样,我怎样才能将验证错误显示在机场的虚拟名称属性上?
答案 0 :(得分:4)
我认为你使用before_validation
回调正确的方式。
您可以像每个普通属性一样验证虚拟属性。所以你需要的只是模型中的一些验证。试试这个:
validates :departure_airport, presence: true
validates :arrival_airport, presence: true
这会给对象错误添加错误,错误应该显示在表单中......