Ruby on rails RubyonRails中虚拟属性的验证
我在Rails(3.2.0)上运行Ruby(1.9.3),在验证虚拟属性时遇到问题 我有一个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
航班
模型,该模型表示一个航班,其中一个属性表示出发和到达机场
因为选择机场的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,成功了!:-)