2015-10-18 53 views
-2

为了管理表单,我有一个无表模型(即不保存在数据库中)。后面的指令在Railscast情节设置好后,它的主要工作:Rails 4 - 显示非Activerecord模型中的错误

class PaymentRequest 
    include ActiveModel::Validations 
    include ActiveModel::Conversion 
    extend ActiveModel::Naming 

    attr_accessor :request_id, :amount, :description, :reference, :charge_date 
    validates :request_id, presence: true 
    validates :amount, presence: true, numericality: true 
    validates :charge_date, presence: true 

    def initialize(attributes = {}) 
     attributes.each do |name, value| 
      send("#{name}=", value) 
     end 
    end 

    def persisted? 
     false 
    end 
end 

当我做PaymentRequest.new().valid?,我得到false(反之亦然,如果它实际上是有效的)。

但是我没有收到任何错误消息:在运行PaymentRequest.new().errors.messages时,我收到一个空的散列{}

我错过了什么?

谢谢!

回答

1

errors只有在调用验证方法后才会填充,如valid?。如果你这样做,你会像使用ActiveRecord对象一样获得错误消息。

下面是一个例子,使用你在你的问题中提供的PaymentRequest代码:

p = PaymentRequest.new 
p.errors.messages # => {} 
p.valid? # => false 
p.errors.messages # => {:request_id=>["can't be blank"],... 

注意如何errors最初是空白的,但得到尽快valid?被称为填充。

+0

明白了 - 我是在控制台中依次运行2进行测试。将它保存到一个变量使差异! – Davor

0

您的errors.messages散列是空的,因为您使用的是new方法:PaymentRequest.new(),因此您并不试图在数据库中保留任何内容。

验证在对象被保存在数据库中之前被调用,例如,当您尝试save对象或当您调用验证方法时。

在您的例子,如果你尝试保存支付对象,那么你的errors.messages哈希将适当的信息填入:

p = PaymentRequest.new() 
p.errors.messages 
# => {} # empty hash because you did not try to save the p object yet 
p.save # at this point validations are happening 
p.errors.messages 
# => {:charge_date =>["can't be blank"]} . . . 

或者,你可以使用:create方法:

p = PaymentRequest.create() 
p.errors.messages 
# => {:charge_date =>["can't be blank"]} . . . 

然后,您将看到errors.messages哈希中的错误消息,因为create方法试图保存该对象。

要回答您的其他问题,PaymentRequest.new().valid?false,因为在保存/保留之前的所有内容都是falsevalid?将返回true当对象是save d成功。

+0

我可能已经更清楚地表明我没有将它保存到数据库(因此持续的错误)。有效?无论坚持如何工作(因为在开始时包含/扩展)。 – Davor

相关问题