2012-03-17 85 views
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?如果是这样,我怎样才能得到验证错误显示在机场的虚拟名称属性?

回答

4

我认为你正在用before_validation回调正确的方式。

您可以像验证每个普通属性一样验证虚拟属性。所以你所需要的只是模型中的一些验证。试试这个:

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

这应该添加一个错误的对象错误,应该显示错误在您的形式...

+0

感谢您的迅速反应!我已经对'departure_airport'和'arrival_airport'进行了验证。问题在于这些不是表单中“输入”字段所代表的字段。我不能简单地验证出席状态,因为当有人在其中输入文本时,该字段存在,但实际的Airport对象将会丢失。 – Laurens 2012-03-17 11:15:51

+0

这就是为什么你注册'before_validation'回调。当用户输入乱码时,它不会找到机场,验证将失败。错误将被添加并显示给用户。也许你应该考虑添加一个自定义的错误按摩。 – klump 2012-03-17 11:21:12

+0

对不起我的坏。我不明白。也许你需要你自己的验证方法。你可以用'self.errors.add(:fieldname,“message”)'向对象添加错误。如果您现在使用'departure_airport_name'作为字段名并添加一条消息,它将显示在'departure_airport_name'字段中。 – klump 2012-03-17 11:24:05