14

我有一个名为“show”的控制器的视图。在该视图中,我想呈现另一个控制器视图的内容 - 显然,该视图上的表单的逻辑也与它所属的控制器对话。我该怎么做呢?我对 Rails 相当陌生,我对框架还不是 100% 有信心。

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

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

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

IE。

我有一个视图,它被渲染到布局上。该视图属于控制器 A。我需要在原始视图中渲染控制器 B 的“索引”和“新”视图(上图)

.

4

4 回答 4

34

您问题中的术语有点混乱。如果在一个控制器中,并且您想在另一个控制器的另一个操作方法中执行代码并呈现其模板,您应该重定向到该操作。假设另一个控制器称为 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 替换为来自引用的操作的响应。

于 2009-11-24T05:08:36.477 回答
0

如果你真的想完全呈现另一个动作(即模拟一个通过整个 Ruby on Rails 堆栈的请求),你可以使用Webrat(查看Webrat 截屏视频)。

在传统的 MVC Web 应用程序中,您应该很少需要这样做。但根据我开发 SOFEA 风格和微架构 webapps的经验,这种情况越来越普遍。

于 2009-12-16T05:25:12.847 回答
0

我相信问题是要求能够将侧边栏(或重复的表单或..)之类的东西渲染到它自己的控制器,因此不需要重复在每个控制器中显示该视图所需的逻辑使用它。

从使用 rails 的第一天起,我就一直很沮丧,因为没有一种简单的方法可以简单地调用一个动作,就好像它是一个函数一样,并让它返回渲染的内容。

如果你想花点心思,有一个单元格 gem,它为小 ui 块提供了一个完整的继承系统,但它最近似乎没有更新,而且在大多数情况下它是矫枉过正的。我假设你已经知道 partials 和 yield/content_for 在某些情况下很有用,但是如果你有一堆不同的动作和一堆混合和匹配的不同 UI 元素,例如,一个有一堆类型的博客,就会变得一团糟随机显示的侧边栏。

在 Mauricio Moraes 对这个问题的回答中,对三种方法(部分、产量和单元格)的各种优缺点进行了很好的讨论,但实际上我认为最简单的方法就是使用 javascript 来填充页面的那一部分(表单,侧边栏)通过 XHR。

仍然觉得一定有一些我还没有想出的技巧可以让您将动作视为服务器端的功能,但还没有运气。

哦,对于简单的情况,您可能可以将逻辑放入一个关注点,以便在多个控制器之间共享它,但对于我来说任何复杂的事情也感觉不对。

于 2021-05-29T20:08:02.397 回答
-1

我不确定我是否完全理解您的问题陈述(为什么必须从视图中完成),但我会说您只是redirect_to从控制器 A 调用控制器 B。

于 2009-11-20T02:09:13.010 回答