2012-05-09 15 views
0

I'm on Rails 2.3.8;私は、このモデルていますRails 2.3:ActiveRecordエラーの種類を取得するには?

class Coupon < ActiveRecord::Base 

    validate :foo 

    def foo 
    errors.add_to_base :foo_error 
    end 
end 

は、私の目的は、エラーの種類を取得することで、例えばこのような何か:

c = Coupon.new 
c.valid? 
c.errors.types #=> [[:base, :foo_error]] 

は、私は、エラーの種類を取得するために管理し、本当に奇妙なモンキーパッチ付き:

# in config/initializers/active_record_errors_types.rb 
module ActiveRecord 
    class Errors 
    def types 
     instance_variable_get(:@errors).map do |k,v| 
     [ k.to_sym, v[0].instance_variable_get(:@type) ] 
     end 
    end 
    end 
end 

c = Coupon.new 
c.valid? 
c.errors.types #=> [[:base, :foo_error]] 

エラータイプを取得するにはどうすればよいでしょうか?

答えて

0

これを試してみてください:

module ActiveRecord 
    class Errors 
    def types 
     @errors.values.flatten.map(&:type).uniq 
    end 
    end 
end 

あなたは直接ARオブジェクトの呼び出しを行うことができますパッチ適用猿を回避したい場合。

user.errors.instance_variable_get(:@errors).values.flatten.map(&:type).uniq 

別の方法としては、以下の操作を行うことができます

[].tap {|types| user.errors.each_error{|a,e| types << e.type}}.uniq 
+0

それは 'のActiveRecord :: Errors'をmonkeypatches、私は避けるだろう...エラーの種類を取得するために何のクリーンな方法が存在しないことが可能になることができますか? – mdesantis

+0

答えを一新しました。 –

+0

これは動作しません: 'のための'未定義のメソッド 'values' '...' instance_variable_get'を使って動作します: 'user.errors.instance_variable_get(:@ errors).values.flatten。マップ(&:タイプ).uniq'ですが、それは私の試行と同じくらい変です(しかし、リファクタリング:)) – mdesantis

関連する問題