【发布时间】:2012-09-07 20:07:12
【问题描述】:
在我的 Rails 应用程序中,我有一个 Foo 模型 has_many Bars。我想在Foo 的控制器的show 视图中编辑Bars。另外,我不想每次编辑Bar 时都重新加载整个页面。
为此,我使用了 AJAX。 Bar 控制器有两个视图 - show 和 edit。 bar#show 有一个编辑按钮,Bar 两个视图都不是重新加载整个页面,而是使用 AJAX 执行 HTTP 请求,然后替换包含表示特定 Bar 对象的 HTML 标记的内容Foo 的 show 视图。
在渲染foo#show 时,我不想为每个Bar 对象执行HTTP 请求。此外,Bar 的控制器方法需要从数据库中获取 Bar 记录——这是我不想在foo#show 中做的事情,因为我可以通过单个查询加载所有这些记录,这要快得多而不是单独加载每一个。
所以,我所做的是将Bar 的视图设为局部视图,而不是普通视图。这样,我可以从控制器和另一个视图中渲染它们。
现在的问题是,除了从数据库加载Bar 记录之外,这些视图还需要更多的准备工作,而且与加载记录不同——无论是从控制器还是从另一个视图呈现部分内容,都需要进行这些准备工作。
我现在正在做的是在部分erb 的开头有一个大约 10 行的红宝石块,并在那里做准备。虽然这样可行,但我意识到这是一个糟糕的设计——这种准备应该在控制器中完成,而不是在视图中。更糟糕的是 - 有时,show 部分的准备代码可以决定需要渲染edit 部分,所以我需要从show 部分调用另一个部分渲染 - 再次,应该在另一个地方完成。
但是,我只是不知道将该代码放在哪里。我想过把它作为一个视图助手,但是视图助手应该是从视图中调用的,而且我还需要从控制器中调用它。
那么,解决这个问题的 RoR 方法是什么?
【问题讨论】:
标签: ruby-on-rails ruby model-view-controller architecture