1

在我的 Rails 应用程序中,我有一个Foo模型has_many Bar。我想编辑Bars控制器show视图中Foo的 s 。另外,我不想在每次编辑Bar.

为此,我正在使用 AJAX。控制器有Bar两个视图 -showedit. bar#show有一个编辑按钮,并且两个Bar视图都使用 AJAX 来执行 HTTP 请求,然后替换包含表示该特定Bar对象Foo的HTML 标记的内容,而不是重新加载整个页面show

渲染时foo#show,我不想为每个Bar对象执行 HTTP 请求。此外,Bar的控制器方法需要Bar从数据库中获取记录——这是我不想在 中做的事情foo#show,因为我可以用一个查询加载所有这些,这比单独加载每个查询要快得多。

所以,我所做的就是将Bar's 的视图设为局部视图,而不是普通视图。这样,我可以从控制器和另一个视图中渲染它们。

现在,问题是除了Bar从数据库加载记录之外,这些视图还需要更多的准备工作,并且与加载记录不同 - 无论部分是从控制器还是从另一个视图呈现,这些准备工作都需要完成。

我现在正在做的是在 partial's 的开头有一个大约 10 行的红宝石块erb,并在那里做准备。虽然这样可行,但我意识到这是一个糟糕的设计——这种准备应该在控制器中完成,而不是在视图中。更糟糕的是 - 有时,show部分的准备代码可以决定edit需要渲染部分,所以我需要从show部分调用另一个部分渲染 - 再次,应该在另一个地方完成的事情。

但是,我只是不知道将代码放在哪里。我想过把它作为一个视图助手,但是视图助手应该是从视图中调用的,我还需要从控制器中调用它。

那么,解决这个问题的 RoR 方法是什么?

4

1 回答 1

1

为什么不创建控制器方法?请记住,控制器方法不必绑定到操作 - 控制器只是应用程序中的另一个类。这个控制器方法可以设置一个可以在你的部分中使用的状态(控制器中的变量)。此外,所述控制器的动作方法可以根据该方法来实现(即调用它来获取/准备他们需要的数据)。

class MyController < ApplicationController
  def show
    @intermediate_state = another_method
  end

  private
  def another_method
    "some value is returned here!"
  end
end

查看/部分:

<%= @intermediate_state %>
于 2013-04-10T23:13:10.500 回答