2009-11-20 149 views
13

我有一個稱爲「show」的控制器的視圖。在該視圖中,我想呈現另一個控制器視圖的內容 - 顯然,該視圖上窗體的邏輯與它所屬的控制器交談。我該怎麼做呢?我對Rails相當陌生,但對框架還沒有100%的信心。將部分從一個控制器的視圖渲染到另一個控制器在軌道中的視圖

你幾乎可以將它們視爲視圖上的「小部件」。我知道你可以使用相同的控制器上的視圖使用以下操作:

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

但我需要它從另一個控制器呈現動作(視圖)。

即。

我有一個視圖,它是 渲染到一個佈局。這一觀點, 屬於控制器A. 我需要渲染「索引」和「新」 原始視圖(上面的)的內部從控制器B視圖

+0

引用:「我對rails很新,我對框架還沒有100%的自信。」 - 我對rails並不陌生,但是當我認爲我理解了某些東西,那麼我錯了,一個更好的解決方案或新的rails版本;-) – halfbit 2015-08-10 18:35:06

回答

34

的術語在問題有點困惑。如果在控制器中,並且您想要在另一個控制器的另一個操作方法中執行代碼並呈現其模板,則應該redirect_to該操作。比方說,另一個控制器被稱爲ContractsController

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

如果你只是想使用的視圖模板從另一個方法,從動作的響應,你只需要在渲染參數的前綴控制器的名稱。這不會調用該操作,它只會使用其模板。

例如,如果模板位於合同控制器的文件夾中。

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

我認爲在這種情況下,你實際上是在談論一個部分,它看起來像

render :partial => "/contracts/show_home_page" 

然而,我看到你在這裏抓的是,你真的想調用多個動作方法來呈現單個頁面。這不是它的工作原理。您將不得不設置模板將在單個操作中引用的對象。這是大多數Rails開發人員在模型中放置大量代碼的原因之一,因此設置不會在控制器中重複。

但還有另一種方式...其中的JavaScript魔術進來

在您的網頁,創建這樣一個功能:如果你調用在

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

即使你的頁面已經打開,它會用來自引用操作的響應來替換id爲「categories」的div。

+1

這樣一個非常徹底的答案。我會消化這一段時間,然後回到你身邊。最終我的希望是創建一個像部件一樣的「小部件」,我可以將它們放到任何我喜歡的視圖上。 JavaScript方法是我甚至沒有考慮過的。 – Ash 2009-11-24 05:25:58

+0

不幸的是remote_function不再起作用,因爲原型助手已經在rails 3.1中被移除了,請參閱我們需要的解決方法,如[this](http://stackoverflow.com/questions/13116243/error-undefined-method-remote-function-how-to - 製作 - AJAX通話,與護欄-3-US) – msanjay 2014-06-18 09:22:53

-1

我不知道我完全理解您的問題聲明(爲什麼必須從視圖中進行),但我要說,你只需要調用redirect_to從控制器A到控制器B

+0

好吧,所以我有一個視圖,它被渲染到一個佈局。 該視圖屬於控制器A. 我需要將來自控制器B的「索引」和「新」視圖呈現到該頁面上。 – Ash 2009-11-20 02:13:59

0

如果您確實想完全渲染另一個操作(即模擬請求以遍歷整個Ruby on Rails堆棧),則可以使用Webrat(此處選中Webrat screencast)。

在傳統的MVC Web應用程序中,您應該很少需要這樣做。但根據我開發SOFEA風格和micro-architecture webapps的經驗,這種情況越來越普遍。

相關問題