#self.included(base)在Ruby on Rails的Restful Authentication中做了什么?

时间:2011-03-01 21:47:14

标签: ruby-on-rails restful-authentication

我以为我们会这样做

helper_method :current_user, :logged_in?, :authorized?

使这些控制器方法可用作视图中的辅助方法。但在Restful Authentication的lib/authenticated_system.rb中,我看到了:

# 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

为什么这样做而不是那条单行呢?另外,我没有看到included在任何地方被调用。

5 个答案:

答案 0 :(得分:94)

包含模块时调用self.included函数。它允许方法在基础(包含模块)的上下文中执行。

更多信息:a ruby mixin tutorial

答案 1 :(得分:11)

当使用AuthenticatedSystem方法包含include方法时,self.included方法会被包含在base的参数中的任何内容触发。

您展示的代码会调用helper_method并定义一些有用的帮助程序,但前提是basehelper_method方法。

这样做,所以包括模块可以设置辅助方法以及向类中添加其他方法。

答案 2 :(得分:10)

出于与Peter提到的相同的原因,我想添加一个示例,以便新手开发人员很容易理解 self.included(base) self.extended(基地)

module Module1
 def fun1
    puts "fun1 from Module1"
 end

 def self.included(base)
    def fun2
        puts "fun2 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
  

Test.new.abc#=> abc表格测试

     

Test.new.fun1#=>来自Module1的fun1

     

Test.new.fun2#=>来自Module1的fun2

     

Test.foo#=>来自Module2的foo

     

Test.bar#=>来自Module2的栏

extend:方法可以作为类方法访问

include:方法将作为实例方法使用

self.extended( base )/ self.included( base )中的

base ”:

静态扩展方法中的基本参数将是扩展模块的类的实例对象或类对象,具体取决于您是分别扩展对象还是类。

当一个类包含一个模块时,将调用该模块的self.included方法。 base参数将是包含模块的类的类对象。

答案 3 :(得分:5)

由于这是搜索Google“self.included(base)”时的第一个结果,我将尝试举例说明它是如何工作的。我不知道它与restful-authentication-methods有多大不同。

它主要用于从另一个模块中的一个模块制作方法。

module One
  def hello
    puts 'hello from module One'
  end
end

module Two
  def self.included(base)
    base.class_eval do
      include One
    end
  end
end

class ExampleClass
  include Two
end

ExampleClass.new.hello # => hello from module One

答案 4 :(得分:1)

想要挖掘self.includedself.extended

请看这里:https://ruby-doc.org/core-2.2.1/Module.html#method-i-included