before_filter
はRubyの機能ではなく、Ruby on Rails (Webフレームワーク)によって提供されるクラスメソッドであり、コントローラーでアクションを実行する前に、コントローラーでコードの一部を実行するために使用できます。
では、Ruby on Railsはどのようにそれを行うのでしょうか?
実際にコードを実行しているRubyでクラスを定義している場合は、irbでこれを試してください。
class Hello
puts "defining hello..."
def greet
puts "Hello there"
end
end
クラスを定義すると、ターミナルに「defininghello...」が出力されることがわかります。オブジェクトをインスタンス化しておらず、クラスを定義しただけですが、クラスを定義している途中で任意のコードを実行できます。
「クラスメソッド」と「インスタンスメソッド」を定義できることを知っています。興味深いのは、クラスを定義している間にクラスメソッドを呼び出すことができることです。
class MyClass
def self.add_component(component)
# Here @@components is a class variable
@@components ||= [] # set the variable to an empty array if not already set.
@@components << component # add the component to the array
end
add_component(:mouse)
add_component(:keyboard)
add_component(:screen)
def components
@@components # The @@ gets you the class variable
end
end
MyClass.new.components
=> [:mouse, :keyboard, :screen]
def self.add_component
クラスを定義しながら呼び出すことができるクラスメソッドを定義します。この例add_component
では、クラス変数のリストにキーボードを追加し、def components
インスタンスメソッド(このクラスのインスタンスで呼び出される)がこのクラス変数にアクセスします。クラスメソッドは親クラスで定義されている可能性があり、同じように機能します。その例は少し奇妙かもしれません。
別の例を見てみましょう。
class RubyOnSlugsController
def self.before_filter(callback)
@@callbacks ||= []
@@callbacks << callback
end
def execute_callbacks
@@callbacks.each { |callback| callback.call() }
return "callbacks executed"
end
end
class MyController < RubyOnSlugsController
before_filter Proc.new { puts "I'm a before filter!" }
before_filter Proc.new { puts "2 + 2 is #{2 + 2}" }
end
controller = MyController.new
controller.execute_callbacks
出力します:
I'm a before filter!
2 + 2 is 4
=> "callbacks executed"
Ruby on Railsは、と同様のことを行います(ただし、非常に複雑です) 。これにより、Ruby on Railsbefore_filter
で定義するすべてのコールバックが、通常のコントローラーメソッドの前に呼び出されるようになります。
これで少し問題が解決することを願っています。