0

私は Rails 2.3.8 を使用しています。私はこのモデルを持っています:

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]]

エラーの種類を取得するより良い方法を知っていますか?

4

1 に答える 1

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
于 2012-05-09T11:18:04.837 に答える