【问题标题】:What does #self.included(base) do in Ruby on Rails' Restful Authentication?#self.included(base) 在 Ruby on Rails 的 Restful 身份验证中做了什么?
【发布时间】:2011-07-06 20:33:06
【问题描述】:

我以为我们会这样做

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 在任何地方被调用。

【问题讨论】:

    标签: ruby-on-rails restful-authentication


    【解决方案1】:

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

    更多信息:a ruby mixin tutorial

    【讨论】:

      【解决方案2】:

      出于与彼得提到的相同原因,我想添加一个示例,以便新手开发人员可以轻松理解 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
      
        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 : 方法可以作为类方法访问

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

      • "base" 在 self.extended(base) / self.included(base) 中: 静态扩展方法中的基本参数将是 扩展模块的类的实例对象或类对象 取决于您是分别扩展对象还是类。

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

      【讨论】:

      • 很好的解释@FaaduBalak 让我很开心
      • 嗨@FaaduBaalak,你能简单介绍一下'实例对象或类对象'吗,我对类对象有点困惑。类对象不是指类的实例还是两者都不相同。如果不是那么有什么区别?谢谢。
      • @codemilan 抱歉,我今天看到了这个。你能找出区别吗?
      • 感谢@FaaduBaalak 的回答。但是fun1fun2 之间有什么区别?后者是在self.included(base) 中定义的,而前者不是。清晰度将不胜感激。
      • @BKSpureon 最后添加了 2 个示例以更清晰。谢谢
      【解决方案3】:

      当使用include 方法包含AuthenticatedSystem 方法时,将触发self.included 方法,并将其包含在base 的参数中。

      您显示的代码调用helper_method 并定义了一些有用的帮助器,但前提是base 具有helper_method 方法。

      以这种方式完成,因此包含模块可以设置辅助方法以及向类添加其他方法。

      【讨论】:

        【解决方案4】:

        因为它是在 Google 搜索“self.included(base)”时的第一个结果,所以我将尝试给出一个小例子来说明它是如何工作的。我不知道它与 restful-authentication-approach 有多大不同。

        它基本上用于使来自一个模块的方法在另一个模块中可用。

        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
        

        【讨论】:

        • 感谢您的回答,但可以简单地在模块Two 中添加以下行:include One,结果将是相同的,不是吗?通过self.included(base) 方法这样做有什么好处?
        【解决方案5】:

        想深入了解self.includedself.extended 吗?

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

        【讨论】:

          猜你喜欢
          • 2011-07-02
          • 2011-02-02
          • 1970-01-01
          • 2023-03-15
          • 1970-01-01
          • 1970-01-01
          • 2011-07-03
          • 2018-04-27
          • 2018-03-02
          相关资源
          最近更新 更多