【问题标题】:Where to put preperation code for partials that can be rendered both from a view and from a controller?可以从视图和控制器呈现的部分的准备代码放在哪里?
【发布时间】:2012-09-07 20:07:12
【问题描述】:

在我的 Rails 应用程序中,我有一个 Foo 模型 has_many Bars。我想在Foo 的控制器的show 视图中编辑Bars。另外,我不想每次编辑Bar 时都重新加载整个页面。

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

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

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

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

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

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

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

【问题讨论】:

    标签: ruby-on-rails ruby model-view-controller architecture


    【解决方案1】:

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

    class MyController < ApplicationController
      def show
        @intermediate_state = another_method
      end
    
      private
      def another_method
        "some value is returned here!"
      end
    end
    

    查看/部分:

    <%= @intermediate_state %>
    

    【讨论】:

    • 那么是从partial调用controller方法,还是调用controller方法渲染partial?
    • 您从操作方法(也在控制器上)调用控制器方法,然后使用状态来渲染部分。请参阅已编辑答案中的示例。
    • 当我从另一个控制器中的视图渲染部分视图时,我看不出这有什么帮助...
    • 如果你想在另一个控制器中做同样的事情,你可以将 another_method 设为静态,以便另一个控制器可以调用 MyController.another_method 并获取它需要的数据,或者你可以将它移动到 lib/文件夹中的新类,并在两个控制器中使用该类。无论哪种方式,您的代码都将是 DRY
    猜你喜欢
    • 1970-01-01
    • 2011-09-20
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多