Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What does #self.included(base) do in Ruby on Rails' Restful Authentication?

I thought we would do

helper_method :current_user, :logged_in?, :authorized? 

to make these controller methods available for use as helper methods in views. But in Restful Authentication's lib/authenticated_system.rb, I see:

# Inclusion hook to make #current_user and #logged_in? # available as ActionView helper methods. def self.included(base)   base.send :helper_method, :current_user, :logged_in?, :authorized? if base.respond_to? :helper_method end 

Why is it done this way instead of that single line? Also, I don't see included being called anywhere.

like image 598
nonopolarity Avatar asked Mar 01 '11 21:03

nonopolarity


2 Answers

The self.included function is called when the module is included. It allows methods to be executed in the context of the base (where the module is included).

More info: a ruby mixin tutorial.

like image 193
nathanvda Avatar answered Sep 19 '22 06:09

nathanvda


Out of the same reason which Peter has mentioned I would like to add an example so that it's easy for the newbie developers to understand self.included(base) and self.extended(base) :

module Module1   def fun1     puts 'fun1 from Module1'   end    def self.included(_base)     def fun2       puts 'fun2 from Module1'     end   end    def self.extended(_base)     def fun3       puts 'fun3 from Module1'     end   end end  module Module2   def foo     puts 'foo from Module2'   end    def self.extended(_base)     def bar       puts 'bar from Module2'     end   end end  class Test   include Module1   extend Module2   def abc     puts 'abc form Test'   end end  class Test2   extend Module1 end 
Test.new.abc  #=> abc form Test Test.new.fun1 #=> fun1 from Module1 Test.new.fun2 #=> fun2 from Module1 Test.foo #=> foo from Module2 Test.bar #=> bar from Module2 Test.new.fun3 #=> **NoMethodError** (undefined method `fun3' ..) *Test2*.fun3 #=> fun3 from Module1 
  • extend : methods will be accessible as class methods

  • include : methods will be available as instance methods

  • "base" in self.extended(base) / self.included(base) : The base parameter in the static extended method will be either an instance object or class object of the class that extended the module depending whether you extend a object or class, respectively.

    When a class includes a module the module’s self.included method will be invoked. The base parameter will be a class object for the class that includes the module.

like image 41
FaaduBaalak Avatar answered Sep 22 '22 06:09

FaaduBaalak