2009-11-20 148 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的经验,这种情况越来越普遍。

相关问题