Ruby on rails RubyonRails中虚拟属性的验证

Ruby on rails RubyonRails中虚拟属性的验证,ruby-on-rails,Ruby On Rails,我在Rails(3.2.0)上运行Ruby(1.9.3),在验证虚拟属性时遇到问题 我有一个航班模型,该模型表示一个航班,其中一个属性表示出发和到达机场 因为选择机场的select可能非常庞大,所以我选择了一个自动完成的解决方案,它工作得非常好。我正在使用验证前的回调来正确填充机场的实际ID: before_validation do self.departure_airport = Airport.find_by_long_name(departure_airport_name) se

我在Rails(3.2.0)上运行Ruby(1.9.3),在验证虚拟属性时遇到问题

我有一个
航班
模型,该模型表示一个航班,其中一个属性表示出发和到达机场

因为选择机场的
select
可能非常庞大,所以我选择了一个自动完成的解决方案,它工作得非常好。我正在使用验证前的
回调来正确填充机场的实际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 %>
验证:出发\机场,:到达\机场存在:真
属性访问者:出发地点\机场名称,:到达地点\机场名称

这是正确的方法吗?在验证之前,在
回调中将机场名称转换为ID?如果是这样,我如何才能让验证错误显示在机场的“虚拟名称”属性上?

我认为您在验证前使用
回调的方法是正确的

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

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

这将在对象错误中添加一个错误,错误将显示在您的表单中…

感谢您的快速响应!我已经在
出发机场
到达机场
进行了验证。问题在于,这些字段不是表单上的
输入
表示的字段。我不能简单地验证是否存在,因为当有人在其中键入文本时,字段是存在的,但实际的
Airport
对象将丢失。这就是为什么在验证之前注册
。当用户输入gibberish时,它将找不到机场,验证将失败。将向用户添加并显示一个错误。也许你应该考虑添加一个自定义错误按摩。对不起我的坏。我不明白。也许你需要自己的验证方法。您可以使用
self.errors.add(:fieldname,“message”)
向对象添加错误。如果您现在将
出发机场名称
用作字段名并添加消息,它将显示在
出发机场名称
字段中。谢谢klump,成功了!:-)