【问题标题】:What are the best practices to generate "widgetized" content in Rails在 Rails 中生成“widgetized”内容的最佳实践是什么
【发布时间】:2010-09-10 11:45:21
【问题描述】:

在我以前使用 Zend 框架构建的项目中,我广泛使用了 Zend_view 的“Action View”帮助器。它基本上允许从视图脚本启动一个单独的请求->调度 ti action->view_rendering 循环。

这里是zend framework reference guide 相应页面的链接(搜索“Action View Helper”)。

这个助手是处理小部件化内容的一种非常方便的方式,例如在具有门户布局的页面上,您可以在页面上填充不同的小部件(如广告块、货币信息器等)。

虽然这种方法会对页面的响应时间产生负面影响,因为它涉及大量额外的路由/调度活动,但它允许将小部件代码和视图脚本组织成合理的结构。一个小部件只是一个控制器动作,带有链接的视图脚本。

不幸的是,我在 Rails 中没有找到任何类似的视图助手。 有什么方法可以优雅地在 Rails 中解决这个任务?

【问题讨论】:

  • 虽然方便,但请务必小心使用会再次启动整个调度周期的解决方案。这个模型在我使用 CakePHP 时也很常见,CakePHP 文档和 render_component 文档都评论了这可能有多慢,尤其是如果你经常这样做的话。

标签: ruby-on-rails model-view-controller zend-framework widget


【解决方案1】:

在 Rails 中,ActionControllerrender 方法将 Hash 作为参数并输出一个简单的字符串。您可以像这样在视图中使用它:

<%= render :partial => "shared/widgets/_#{widget.widgettype.name}", :collection => @current_user.widgets %>

在这种情况下,Rails 将遍历 @current_user.widgets 列表,在“app/views/shared/widgets/_widgettypename.html 中找到一个小部件部分.erb",并为每个附加的小部件调用部分。

有关 Rails 部分的进一步阅读,请参阅ActionView::Partials 文档。

【讨论】:

  • 食谱告诉我我试图避免的实际方式。问题是小部件通常需要在模型和控制器部分完成一些工作,然后才能传递给视图。
  • 使用这种方法,我需要在控制器中准备所有数据,其视图将调用小部件部分。当然,可以将小部件逻辑放入单独的类/助手中。但是我需要在两个不同的地方将实际页面与一组特定的小部件链接起来——在控制器中,哪个页面正在被渲染(准备好小部件数据)和控制器的视图脚本(实际的渲染调用)。而且我不喜欢在两个地方激活程序的某些代码以使其正常运行,因为它“丑陋”。
  • 正如我在问题中指出的那样 - Zend Framework 已经非常优雅地解决了这样的任务 - 通过运行单独的 request->dispatch->controller_action->render 循环,结果(html)只是放在放入视图脚本中的某个位置。因此,任何小部件都只是一个带有相关视图脚本的简单控制器操作。但我不知道如何在 Rails 中做到这一点。
  • RadiantCMS 扩展具有类似于您在 Zend 中描述的功能。基本上每个扩展程序都像它自己的小应用程序。您可能想深入研究他们的源代码,看看它是如何工作的。
【解决方案2】:

看来我自己找到了问题的答案。它是“render_component”rails 插件。还有a fork 显然支持Rails3。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多