我在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 ?如果是这样,我怎样才能将验证错误显示在机场的虚拟名称属性上?
我认为你的回调方式是正确的before_validation。
您可以像验证每个普通属性一样验证虚拟属性。因此,您所需要的只是在模型中进行一些验证。尝试这个:
validates :departure_airport, presence: true
validates :arrival_airport, presence: true
Run Code Online (Sandbox Code Playgroud)
这应该向对象错误添加一个错误,并且该错误应该显示在您的表单中...
| 归档时间: |
|
| 查看次数: |
2479 次 |
| 最近记录: |