2014-10-03 68 views
1

我有一个场不直接相关的字段在下面的对象一个Rails输入形式:我将其放入的ActiveRecord字段之前做一些计算。到目前为止没问题:我只是将计算放入控制器中。Rails的验证,不记录

我的问题是,计算可能会失败,我想报告给用户。我知道如何使用Flash警报来做到这一点,但是这并不会将错误与特定的表单输入字段相关联,并且与记录验证给出的错误不一致。我想要做的是告诉表单哪个输入字段失败了,为什么。

我可以找到的所有文档都使用ActiveRecord验证,但这太晚了:我无法创建ActiveRecord,因为我没有数据来填充它(即使我使用无效的虚拟数据填充它 - yech! - 我错过了验证时造成错误的细节。

那么什么是从控制器生成表单验证错误的Rails的方式(好吧,好吧,但我希望得到它的工作之前,我重构它到一个问题),而从模型验证?或者我该怎么做呢?

编辑: 这里是那种以为我试图做的一个例子。想象一下,一个车队经理处理成千上万的车辆,通过他们的注册号码(车牌)来识别。当车辆检查到司机时,没有意义提供包含数千个物品的下拉列表,因此用户输入注册号码。控制器查看(或更好地将其传递给模型以查找),它与车辆记录相匹配,并将车辆记录ID放入结帐中。如果用户输错数字,控制器/模型(可能)会发现该车辆没有条目。我知道要以与其他验证失败一致的方式告诉用户为什么保存失败。

+3

您可以用虚拟属性。将它添加到表单中并将其验证 – Mandeep 2014-10-03 15:25:58

+0

@Mandeep拥有正确的想法。这个逻辑不应该在控制器中,而应该在模型本身中。 – engineersmnky 2014-10-03 15:57:48

回答

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

+0

我曾想过要这样做。我可以在模型中而不是在js中进行计算,就像在(旧的)RailsCast中一样?很大程度上是因为我知道js甚至比我认识的Ruby/Rails还要少,但也因为我需要的所有东西都可以在模型中轻松访问。尽管如此,我需要将整个事物变成原子:计算涉及查找其他记录,所以除非我使它原子化,否则我用来验证表单的计算可​​能是错误的来更新记录。或者我可以直接在setter中提出验证错误? – digitig 2014-10-06 14:00:11

+0

@digitig我要求你在js中进行计算,因为你需要根据用户在表单中的选择来填充它,并且这种方式如果计算失败,用户也将知道实际发生了什么,否则想象你不会向用户显示计算的字段,然后突然用户开始得到验证错误,他/她会思考发生了什么 – Mandeep 2014-10-06 14:30:44

+0

感谢您的帮助,但我仍然不确定js会进入哪里。我已经扩大了问题的范围,我想要做的事情的例子。 – digitig 2014-10-07 16:58:19