11

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ćが指摘したように、私の最初のメンタルモデルは間違っていました。コントローラメソッドは通常、ビューをレンダリングしません。代わりに、コントローラーメソッドビューレンダリングの両方がフレームワークコードによって呼び出されます。これは明らかです。たとえば、任意の名前のコントローラーメソッドを作成でき、ビューがレンダリングされるからです。その場合、明らかに私は親メソッドをオーバーライドしていません。一部のフレームワークコードは、コントローラーメソッド名を解析し、一致するビューを探しています。searchsearch

それでも、フレームワークは、コントローラーメソッドがすでにを呼び出しているかどうかを検出できる必要がありますrender。それは私にとってもう一つの小さな謎です。

4

3 に答える 3

6

コントローラには、と呼ばれるメソッドがありrender_for_textます。これは文字列を受け取り、結果を応答本文として設定します。テキストとしてレンダリングしない場合でも、ビューファイルをレンダリングすると、ファイルの内容が読み取られて評価され、render_for_textメソッドに渡されます。次に、このメソッドは、に呼び出さ@performed_renderれたインスタンス変数のセットを格納しますtrue。これは、コントローラーが既にビューをレンダリングしたことをレールに通知します。

performed?次に、レンダリングアクションが呼び出されたかどうかを示す呼び出されたメソッドがあります。これは、またはが真であるかどう@performed_renderかをチェックすることによって行われ@performed_redirectます。

上記の情報があれば、renderメソッドの最初の行が意味をなし、うまくいけばあなたの質問に答えることができます。

raise DoubleRenderError, "Can only render or redirect once per action" if performed?

于 2010-12-20T16:47:25.187 に答える
1

ビューをレンダリングするとき、Railsは、コントローラー内のインスタンス変数のコピーを使用して、適切なビューテンプレートのインスタンスを初期化します。したがって、インスタンス変数は実際にはビューに継承されませんが、ビューがレンダリングされる前にコントローラーからビューにコピーされます。

ソースで正確な詳細を調べていませんが、上記の説明は、少なくともそれがどのように機能するかについての一般的な考え方を概説しているはずです。

于 2010-12-20T14:49:26.170 に答える
1

Jamis Buckは、数年前に暗黙のルートについてかなり多くのことをここに書いています。

あなたが探しているコードはResourcesにあると思います。Railsはインバウンドリクエストを調べ、(RESTfulルートの場合)ここに移動して、コントローラーとアクションが指定されていない場合はそれらを判別します。

更新:コントローラーは、Railsフレームワークの非常に複雑な部分です。これは、単一のメソッドを持つ単一のRubyクラスほど単純ではありません(これがsuper実際には必要ない理由ですが、個々のメソッドが呼び出される前後の一連の呼び出しです。

Rackはリクエストを処理し、ルーティングを行うRailsに渡し、アクションのActionControllerのインスタンスに委任し(コード化されている場合とされていない場合があります)、その結果をレンダリングプロセスに渡します。

于 2010-12-20T14:58:05.330 に答える