【问题标题】:Rendering Partials From One Controller’s View to Another Controller’s View in Rails在 Rails 中将部分从一个控制器的视图渲染到另一个控制器的视图
【发布时间】:2010-12-18 13:56:15
【问题描述】:

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

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

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

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

即。

我有一个看法,那就是 渲染到布局上。那个观点, 属于控制器 A。 我需要渲染“索引”和“新” 控制器 B 在原始视图中的视图(上图)

【问题讨论】:

  • quote:“我对 Rails 还很陌生,我对框架还不是 100% 有信心。”- 我对 Rails 并不陌生,但每当我认为我理解了某些东西时,我就会错了,有更好的解决方案或新的 rails 版本;-)

标签: ruby-on-rails partial-views controllers


【解决方案1】:

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

【讨论】:

  • 好的,所以我有一个视图,它被渲染到一个布局上。该视图属于控制器 A。我需要将控制器 B 中的“索引”和“新”视图呈现到该页面上。
【解决方案2】:

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

如果您在页面的 onload 中调用它,它会将 id 为“categories”的 div 替换为来自所引用操作的响应。

【讨论】:

  • 如此彻底的答案。我会消化一段时间再回复你。最终,我的希望是创建一组“小部件”,比如局部视图,我可以随意插入任何我喜欢的视图。 javascript方法是我什至没有考虑过的。
  • 不幸的是 remote_function 不再起作用,因为原型助手已在 rails 3.1 中删除,我们需要像this这样的解决方法
【解决方案3】:

如果您真的想完全呈现另一个动作(即模拟一个通过整个 Ruby on Rails 堆栈的请求),您可以使用Webrat(在此处查看Webrat screencast)。

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

【讨论】:

  • 很少?这在每个博客上都是非常标准的(侧边栏是经常需要它自己的控制器但必须与多个不同的控制器/视图一起呈现的内容)并且这个问题已经激发了像单元格这样的宝石,更不用说这里有很多类似的问题了。
【解决方案4】:

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

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

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

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

仍然觉得一定有一些我还没有想到的 hack 可以让您将操作视为服务器端的函数,但还没有运气。

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

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多