I want to override ActiveModel#errors.as_json, but how?

Hey,

I want custom errors.as_json behavior from my implementation of
ActiveModel and with inheritance!

So how do I do something like shown in the following pseudo?

module A
   include ActiveModel

   def errors.to_json
      "blow"
   end
end

module B
    include A

   def errors.to_json
      "go " + super
   end
end

So far, I've been fooling around using instance_eval on errors in A,
but I can't get inheritance from that in B.

Lille

Hey,

I want custom errors.as_json behavior from my implementation of
ActiveModel and with inheritance!

So how do I do something like shown in the following pseudo?

Ruby doesn't work that way. You'd need to override to_json on the
ActiveModel::Errors class. if you want to be able to have different
classes have an errors object that behave in different ways then you
could try subclassing ActiveModel::Errors and have the errors method
on your object return an instance of that subclass rather than an
instance of ActiveModel::Errors

Fred

On Nov 16, 2:52 am, Lille <lille.pengu...@gmail.com> wrote:> Hey,

> I want custom errors.as_json behavior from my implementation of
> ActiveModel and with inheritance!

> So how do I do something like shown in the following pseudo?

Ruby doesn't work that way. You'd need to override to_json on the
ActiveModel::Errors class. if you want to be able to have different
classes have an errors object that behave in different ways then you
could try subclassing ActiveModel::Errors and have the errors method
on your object return an instance of that subclass rather than an
instance of ActiveModel::Errors

yet another option would be to redefine the errors method to be

def errors
  super.tap {|e| e.extend ExtraErrorsBehaviour}
end

where ExtraErrorsBehaviour is a module that overrides some of the
methods on the errors object (I vaguely recall an railsconf talk a
long time ago by the jruby guys saying that calling extend forces ruby
to dump its method caches, i.e. calling extend a lot will slow you
down a bit but I've no idea if that applies to ruby 1.9.x)

Fred