Railsフレームワークで次のことを実現するためにRubyの手法がどのように使用されているかを誰かが知っているかどうかだけ知りたいです。
index
たとえば、Railsコントローラーでメソッドを記述しない場合でも、URLがそのルートと一致すると、Railsはインデックスビューファイルをレンダリングします。私のコントローラーは親クラスを継承しているので、それは理にかなっています。親クラスには独自のindex
メソッドが必要です。
ただし、メソッドを定義し、index
インスタンス変数を設定するように指示した場合でも、適切なビューがレンダリングされます。例えば:
def index
@weasels = Weasel.all
# If I omit this line, Rails renders the index anyway.
# If this behavior is defined in the parent class's index method,
# it seems that by overriding the method, my index wouldn't do it.
# I'm not explicitly calling super to get the method from
# ActionController::Base, but maybe Rails is doing something like that?
render :index
end
純粋なRubyでは、その動作を取得するために呼び出すsuper
必要があると思います。
Railsは、ある種のメタプログラミング手法を使用して、コントローラーメソッドがを呼び出すことを保証していると思いますsuper
。もしそうなら、誰かがそれを説明できますか?これを行うソースコードを教えていただけますか?
アップデート
MladenJablanovićが指摘したように、私の最初のメンタルモデルは間違っていました。コントローラメソッドは通常、ビューをレンダリングしません。代わりに、コントローラーメソッドとビューレンダリングの両方がフレームワークコードによって呼び出されます。これは明らかです。たとえば、任意の名前のコントローラーメソッドを作成でき、ビューがレンダリングされるからです。その場合、明らかに私は親メソッドをオーバーライドしていません。一部のフレームワークコードは、コントローラーメソッド名を解析し、一致するビューを探しています。search
search
それでも、フレームワークは、コントローラーメソッドがすでにを呼び出しているかどうかを検出できる必要がありますrender
。それは私にとってもう一つの小さな謎です。