我以为我们会这样做
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
在任何地方被调用。
答案 0 :(得分:94)
包含模块时调用self.included
函数。它允许方法在基础(包含模块)的上下文中执行。
更多信息:a ruby mixin tutorial。
答案 1 :(得分:11)
当使用AuthenticatedSystem
方法包含include
方法时,self.included
方法会被包含在base
的参数中的任何内容触发。
您展示的代码会调用helper_method
并定义一些有用的帮助程序,但前提是base
有helper_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.included
和self.extended
?
请看这里:https://ruby-doc.org/core-2.2.1/Module.html#method-i-included