7
我在Rails(3.2.0)上运行Ruby(1.9.3),并且验证虚拟属性时出现问题。验证Ruby on Rails中的虚拟属性
我有一个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
的问题,但是,当用户输入一个不存在于数据库中的机场的名称,提交失败因为任一机场的编号是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?如果是这样,我怎样才能得到验证错误显示在机场的虚拟名称属性?
感谢您的迅速反应!我已经对'departure_airport'和'arrival_airport'进行了验证。问题在于这些不是表单中“输入”字段所代表的字段。我不能简单地验证出席状态,因为当有人在其中输入文本时,该字段存在,但实际的Airport对象将会丢失。 – Laurens 2012-03-17 11:15:51
这就是为什么你注册'before_validation'回调。当用户输入乱码时,它不会找到机场,验证将失败。错误将被添加并显示给用户。也许你应该考虑添加一个自定义的错误按摩。 – klump 2012-03-17 11:21:12
对不起我的坏。我不明白。也许你需要你自己的验证方法。你可以用'self.errors.add(:fieldname,“message”)'向对象添加错误。如果您现在使用'departure_airport_name'作为字段名并添加一条消息,它将显示在'departure_airport_name'字段中。 – klump 2012-03-17 11:24:05