Rails验证表单,而不是记录

时间:2014-10-03 15:23:17

标签: ruby-on-rails ruby validation activerecord

我有一个Rails输入表单,其中一个字段与底层对象中的字段没有直接关系:在将它放入ActiveRecord字段之前,我必须进行一些计算。到目前为止还可以:我只是把计算放到控制器中。

我的问题是计算失败了,我想向用户报告。我知道如何使用闪存警报来执行此操作,但这并不会将错误与特定表单输入字段相关联,并且与记录验证提供的错误不一致。我想要做的是告诉表单哪个输入字段失败,以及原因。

我可以找到的所有文档都使用ActiveRecord验证,但为时已晚:我无法创建ActiveRecord,因为我没有填充数据(即使我使用无效的虚拟数据填充它 - yech! - 我已经丢失了到达验证时导致错误的详细信息。)

那么Rails从控制器生成表单验证错误的方式是什么(好吧,好吧,但是我希望在将其重构为关注之前让它工作)而不是模型验证器?或者我应该做什么呢?

编辑: 这是我想要做的那种想法的一个例子。想象一下,一个车队经理处理成千上万的车辆,通过他们的注册号码(车牌)来识别。当车辆检查给驾驶员时,没有必要提供具有数千个物品的下拉列表,因此用户输入登记号码。控制器查看它(或者,更好地,将其传递给模型以查找),它与车辆记录匹配,并且车辆记录id被放入结账。如果用户输入错误号码,则控制器/模型(可能)发现该车辆没有输入。我知道想以一种与其他验证失败一致的方式告诉用户保存失败的原因。

1 个答案:

答案 0 :(得分:2)

  

我的问题是计算失败了,我想向用户报告。

虚拟属性:

虚拟属性是添加不直接映射到数据库的表单字段的简洁方法 ,我认为它非常适合您的需求。要创建虚拟属性,您可以在模型中添加以下行:

class ModelName < ActiveRecord::Base
  attr_accessor  :your_field
end

之后,您可以在表单中添加此字段,并在通过js进行计算后预填充该字段。然后,您可以在模型中添加自定义验证,并检查计算是否正确

class ModelName < ActiveRecord::Base
  attr_accessor  :your_field

  validate :some_custom_validation_method

  def some_custom_validation_method
    # some logic 
  end
end

有关详细信息,请查看此railscast episode on virtual attributes