私たちはやろうと思った
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
がどこから呼び出されているかわかりません。
self.included
関数は、モジュールが含まれるときに呼び出されます。メソッドは、ベースのコンテキスト(モジュールが含まれる場所)で実行されます。
詳細: a Ruby mixin tutorial 。
ピーターが言及したのと同じ理由から、初心者の開発者が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メソッドが呼び出されます。基本パラメーターは、モジュールを含むクラスのクラスオブジェクトになります。
AuthenticatedSystem
メソッドを使用してinclude
メソッドをインクルードすると、self.included
メソッドは、base
の引数に含まれていたものでトリガーされます。
示したコードはhelper_method
を呼び出し、いくつかの役立つヘルパーを定義しますが、base
にhelper_method
メソッドがある場合のみです。
モジュールを含めてヘルパーメソッドをセットアップし、クラスに追加のメソッドを追加できるように、この方法で行われます。
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
self.included
およびself.extended
を掘り下げたいですか?
こちらをご覧ください: https://Ruby-doc.org/core-2.2.1/Module.html#method-i-included