On Friday, 10 October 2014 09:08:29 UTC-4, rusik wrote:
>
>  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. ( 
http://www.ruby-doc.org/core-2.1.3/Module.html#method-i-included ) 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:

http://api.rubyonrails.org/classes/ActiveSupport/Concern.html

--Matt Jones

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to rubyonrails-talk+unsubscr...@googlegroups.com.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/rubyonrails-talk/d54def3c-678d-4188-b0e5-63fbec468f8d%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to