14

「show」というコントローラーのビューがあります。そのビュー内で、別のコントローラーのビューのコンテンツをレンダリングしたいと思います。もちろん、そのビューのフォームが、それが属するコントローラーと通信するためのロジックもレンダリングします。どうすればよいですか?私はRailsにかなり慣れていませんが、フレームワークにはまだ100%自信がありません。

ビュー上では、ほとんどそれらを「ウィジェット」と見なすことができます。次を使用して、ビュー上の同じコントローラーからアクションをレンダリングできることを知っています。

render :action => "show_home_page", :layout=> false

しかし、別のコントローラーからアクション(ビュー)をレンダリングするために必要です。

すなわち。

レイアウトにレンダリングされるビューがあります。そのビューはコントローラーAに属しています。コントローラーBからの「インデックス」ビューと「新しい」ビューを元のビュー(上記)内にレンダリングする必要があります。

4

4 に答える 4

34

あなたの質問の用語は少し混乱しています。がコントローラー内にあり、別のコントローラーの別のアクションメソッドでコードを実行してそのテンプレートをレンダリングする場合は、そのアクションにredirect_toする必要があります。他のコントローラーがContractsControllerと呼ばれているとしましょう

redirect_to :controller => "contracts", :action => "show_home_page"

アクションからの応答として別のメソッドのビューテンプレートを使用するだけの場合は、renderパラメーターでコントローラーの名前のプレフィックスを付ける必要があります。これはアクションを呼び出さず、テンプレートを使用するだけです。

たとえば、テンプレートがコントラクトコントローラーのフォルダーにある場合です。

render :action => "/contracts/show_home_page", :layout=> false

この場合、あなたは実際にパーシャルについて話していると思います。

render :partial => "/contracts/show_home_page"

ただし、ここで把握しているのは、実際には複数のアクションメソッドを呼び出して1つのページをレンダリングしたいということです。これはそれがどのように機能するかではありません。テンプレートが1回のアクションで参照するオブジェクトを設定する必要があります。これが、ほとんどのRails開発者がモデルに多くのコードを配置する理由の1つであるため、セットアップがコントローラー全体で繰り返されることはありません。

しかし、別の方法があります... JavaScriptの魔法が登場します。

ページで、次のような関数を作成します。

<script type="text/javascript" language="javascript">    
function load_categories() {
            <%= remote_function(:url => {:controller => "categories", :action => "list"},
                                  :update => "categories")%>
        };
</script>

ページのonloadでもこれを呼び出すと、参照されているアクションからの応答でid"categories"のdivが置き換えられます。

于 2009-11-24T05:08:36.477 に答える
0

本当に別のアクションをレンダリングしたい場合(つまり、Ruby on Railsスタック全体を通過するリクエストをシミュレートしたい場合)、Webratを使用できます Webratのスクリーンキャストをここで確認してください)。

従来のMVCWebアプリケーションでは、これを行う必要はほとんどありません。しかし、SOFEAスタイルのマイクロアーキテクチャWebアプリを開発した私の経験では、これはますます一般的になっています。

于 2009-12-16T05:25:12.847 に答える
0

質問は、サイドバー(または繰り返しフォームまたは..)のようなもののレンダリングをそれ自体のコントローラーにファームアウトする機能を求めていると思います。そのため、すべてのコントローラーでそのビューを表示するために必要なロジックを繰り返す必要はありません。それを使用します。

1日目から、アクションを関数であるかのように単純に呼び出して、レンダリングされたコンテンツを返す簡単な方法がないことに不満を感じています。

ファンシーになりたい場合は、小さなuiチャンクの継承のためのシステム全体を提供するcells gemがありますが、最近更新されていないようで、ほとんどの場合、やり過ぎです。パーシャルとyield/content_forについてはすでに知っていると思いますが、これらは場合によっては便利ですが、さまざまなアクションとさまざまなUI要素が混在して一致する場合は、厄介になります。たとえば、さまざまなタイプのブログなどです。ランダムに表示されるサイドバーの。

この質問に対するMauricioMoraesの回答には、3つのアプローチ(部分、歩留まり、セル)のさまざまな長所と短所についてのすばらしい議論がありますが、実際には、JavaScriptを使用してページのその部分を埋めるのが最も簡単な方法だと思います(フォーム、サイドバーは何でも)XHR経由。

それでも、アクションをサーバー側の関数として扱うことができる、私が理解していないハックがあるに違いないと感じていますが、まだ運がありません。

ああ、そして単純なケースでは、おそらくロジックを複数のコントローラー間で共有することを懸念することができますが、それは私にとって複雑なことでも間違っていると感じます。

于 2021-05-29T20:08:02.397 に答える
-1

問題の説明を完全に理解しているかどうかはわかりませんが(なぜこれをビューから実行する必要があるのか​​)、redirect_toコントローラーAからコントローラーBに電話するだけです。

于 2009-11-20T02:09:13.010 に答える