ActiveSupport::Concern small question

Hello all.

In this example, as i understand that included block is running when Exclaimable module is included in Person and after a Person class methods are ‘initialized’

require ‘active_support/concern’

module Exclaimable extend ActiveSupport::Concern included do self.new.hello end end

class Person include Exclaimable def hello puts ‘person hello’ end end

Output: Exception: NoMethodError: undefined method `hello’ for #Person:0x00000103cbdcd0

But i see that, Person class doesn’t have hello method, why ? Please, help !

So, i can’t understand - what diifference between

included do self.new.hello end

and class method:

self.included(base) base.new.hello end

Both code get same error ( see above )

Hello all.

In this example, as i understand that included block is running when Exclaimable module is included in Person and after a Person class methods are ‘initialized’

No. See below for additional information, but if include Exclaimable is the first thing in a class definition, only methods defined on the declaring class’s superclass (Object, in the case of Person) will be available.

require ‘active_support/concern’

module Exclaimable extend ActiveSupport::Concern included do self.new.hello end end

class Person include Exclaimable def hello puts ‘person hello’ end end

Output: Exception: NoMethodError: undefined method `hello’ for #Person:0x00000103cbdcd0

But i see that, Person class doesn’t have hello method, why ? Please, help !

The stuff between class Person and end is just code. The hello method isn’t available yet because it hasn’t been DEFINED yet when include Exclaimable executes.

So, i can’t understand - what diifference between

included do self.new.hello end

and class method:

self.included(base) base.new.hello end

Both code get same error ( see above )

self.included is Ruby’s built-in hook. ( Class: Module (Ruby 2.1.3) ) It gets called when the module that declares it is included in another module or class.

ActiveSupport::Concern adds the included do idiom, to make situations where one module depends on another more straightforward. See the last section of the docs for more:

–Matt Jones