web-dev-qa-db-ja.com

#self.included(base)は、Ruby on RailsのRestful認証で何をしますか?

私たちはやろうと思った

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がどこから呼び出されているかわかりません。

51

self.included関数は、モジュールが含まれるときに呼び出されます。メソッドは、ベースのコンテキスト(モジュールが含まれる場所)で実行されます。

詳細: a Ruby mixin tutorial

96
nathanvda

ピーターが言及したのと同じ理由から、初心者の開発者がself.included(base)およびself.extended(base)を理解しやすいように例を追加したいと思います

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 form Test

Test.new.fun1#=> Module1のfun1

Test.new.fun2#=> Module1のfun2

Test.foo#=> Module2のfoo

Test.bar#=> Module2のバー

extend:メソッドはクラスメソッドとしてアクセス可能になります

include:メソッドはインスタンスメソッドとして利用可能になります

"base" self.extended(base)/ self.included(base)で:

静的拡張メソッドの基本パラメーターは、オブジェクトを拡張するかクラスを拡張するかによって、モジュールを拡張したクラスのインスタンスオブジェクトまたはクラスオブジェクトになります。

クラスにモジュールが含まれる場合、モジュールのself.includedメソッドが呼び出されます。基本パラメーターは、モジュールを含むクラスのクラスオブジェクトになります。

12
FaaduBaalak

AuthenticatedSystemメソッドを使用してincludeメソッドをインクルードすると、self.includedメソッドは、baseの引数に含まれていたものでトリガーされます。

示したコードはhelper_methodを呼び出し、いくつかの役立つヘルパーを定義しますが、basehelper_methodメソッドがある場合のみです。

モジュールを含めてヘルパーメソッドをセットアップし、クラスに追加のメソッドを追加できるように、この方法で行われます。

12
Ryan Bigg

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
5
Peter Piper

self.includedおよびself.extendedを掘り下げたいですか?

こちらをご覧ください: https://Ruby-doc.org/core-2.2.1/Module.html#method-i-included

1
张健健