2016-05-10 17 views
1

すべてのインターネットを読んだら、この問題を入力する必要があります。Rails 4の非永続モデルのカスタム検証

コンテキスト: 私はnon persisted Rails 4 modelそのマニュアルに従って、ActiveModel::Validations

コード含まれ、ActiveModel::Model使用している:私は作成しますとき

class GoodnessValidator < ActiveModel::Validator 
    def validate(record) 
    if record.first_name == "Evil" 
     record.errors[:base] << "This person is evil" 
    end 
    end 
end 

class Person 
    include ActiveModel::Model 
    include ActiveModel::Validations 

    validates_with GoodnessValidator 
    attr_accessor :first_name 
end 

問題新しいPersonp = Person.new(first_name: 'Evil')として検証する必要があります。これは「悪人」です。だから、のようなエラーアクセサーが私にすべてのエラーでHashを返すはずです。

ただし、常に空です。p.errorsは何も返しません。決して。

[102] pry(main)> p = Person.new(first_name: 'Evil') 
=> #<Person:0x007fa0925809f0 @first_name="Evil"> 
[103] pry(main)> p.errors 
=> #<ActiveModel::Errors:0x007fa09173ac88 @base=#<Person:0x007fa0925809f0 @errors=#<ActiveModel::Errors:0x007fa09173ac88 ...>, @first_name="Evil">, @messages={}> 
[104] pry(main)> p.errors.full_messages 
=> [] 
[105] pry(main)> 

答えて

2

通常、検証はモデルを保存するときにトリガーされます。あなたの場合、手動で実行し、エラーをチェックする必要があります:

p = Person.new(first_name: 'Evil') 
unless p.valid? # runs the validations 
    puts inspect p.errors 
end 
+0

逆に、検証をトリガする 'invalid?'メソッドもあります。 –

+0

オハイオ州、良い点!あなたが正しいです、バリデータは前にインスタンス化され、有効でなければならないクラスですか? – skozz

+0

Sunil:無効ですか?もちろん、もちろん動作します:D – skozz

関連する問題