2015-10-18 51 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

相關問題