代码之家  ›  专栏  ›  技术社区  ›  Ash

在Rails中将一个控制器的视图渲染为另一个控制器的视图

  •  13
  • Ash  · 技术社区  · 15 年前

    我有一个名为“显示”的控制器视图。在这个视图中,我想呈现另一个控制器视图的内容——显然,该视图上的窗体与它所属的控制器进行对话的逻辑。我该怎么做?我对Rails还比较陌生,对这个框架还没有100%的信心。

    您几乎可以在视图中将它们视为“小部件”。我知道您可以使用以下方法从视图上的同一控制器呈现操作:

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

    但我需要它从另一个控制器呈现操作(视图)。

    IE.

    我有一个观点,那就是 渲染到布局上。那个观点, 属于控制器A。 我需要呈现“index”和“new” 来自控制器B的原始视图(上图)内的视图

    .

    3 回复  |  直到 9 年前
        1
  •  34
  •   MattMcKnight    15 年前

    你问题中的术语有点混乱。如果在一个控制器中,并且您希望在另一个控制器的另一个操作方法中执行代码并呈现其模板,那么您应该重定向到该操作。假设另一个控制器叫做ContractsController

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

    如果只想使用另一个方法的视图模板作为操作的响应,只需在render参数中为控制器的名称加前缀。这不会调用操作,它只使用其模板。

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

    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>
    

    如果在onload中甚至在页面中调用它,它将用引用操作的响应替换id为“categories”的DIV。

        2
  •  0
  •   Hendy Irawan    15 年前

    如果您真的想完全呈现另一个操作(例如,模拟一个通过整个RubyonRails堆栈的请求),可以使用 Webrat (检查) Webrat screencast 这里)。

    在传统的MVC Web应用程序中,很少需要这样做。但以我的经验,发展索菲娅风格和 micro-architecture webapps 越来越普遍。

        3
  •  -1
  •   JRL    15 年前

    我不确定我完全理解你的问题陈述(为什么必须从这个角度来做),但我想你只要打电话 redirect_to 从控制器A到控制器B。