1

重複の可能性:
ActiveRecordのコールバックと検証の順序は何ですか?

私はJavaのバックグラウンドから来ています。Railsで非常に奇妙だと思うことの1つは、クラスのすぐ下にある属性などのコールバック関数を設定できることですbefore_filter

class SomeController < ActionController::Base
  before_filter Proc.new {.....}
end

私はそれがどのように機能するのか本当に理解していません。説明するこの投稿を見つけましたbefore_filter。私は論理の流れを理解しており、それは単なる方法です。before_filterしかし、コールバックチェーンを設定するためにいつ実行されるのかはまだわかりません。

4

2 に答える 2

14

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で定義するすべてのコールバックが、通常のコントローラーメソッドの前に呼び出されるようになります。

これで少し問題が解決することを願っています。

于 2013-01-16T02:12:06.037 に答える
1

メソッド自体は、before_filterコントローラーファイルがロードされたとき(つまり、サーバーが起動したとき)に実行されます。これは、クラスが定義されるとすぐにコールバックチェーンが設定されることを意味します。

設定するコールバックに関しては、コントローラーにはprocessアクションの名前をとるメソッド(「インデックス」など)があり、で適切なアクションメソッドを呼び出しますprocess_actionコールバックモジュールは、コールバックを実行する実装でこのメソッドをオーバーライドします。

于 2013-01-16T01:33:54.503 に答える