【问题标题】:Clean controllers: preparing data for views清洁控制器:为视图准备数据
【发布时间】:2014-02-10 07:50:30
【问题描述】:

假设我有一个控制器,它带有一个呈现视图的操作。视图需要数据来呈现。我知道以下方法来准备并将其发送到视图:

  1. 使用实例变量

    class CitiesController < ApplicationController
      def index
        @cities = Cities.order(:name).limit(10)
      end
    end
    

    这是Rails documentation中可以找到的默认方法,但它有一些缺点:

    1. 它使动作代码变胖,不仅负责控制器逻辑,还负责数据准备。
    2. 视图需要通过实例变量访问这些数据——那些@变量违反了最小惊讶原则。
  2. 使用辅助方法

    class CitiesController < ApplicationController
      helper_method :cities
    
      def index
      end
    
      def cities
        @cities ||= Cities.order(:name).limit(10)
      end
    end
    

    这是我最喜欢的方式。它使动作方法保持干净,因此我可以在那里实现控制器逻辑,而不是在一种方法中将其与数据准备混合。此外,无需在视图中使用神秘的实例变量,使它们相互隔离。然而:

    1. 数据准备仍在控制器中。当有很多这些帮助方法时,它变得不可读,尤其是当它们与不同的操作/视图相关时。
    2. 需要为每个辅助方法指定一个唯一的名称。比如说,我不能有一个名为products 的方法,它会为不同的操作返回不同的数据(当然,我可以用一种方法来做,但看起来很难看)。
  3. 使用外观模式

    本文部分解决了问题:https://medium.com/p/d65b86cdb5b1 但我不喜欢这种方法,因为它在视图中引入了@magic_facade_object

  4. 使用继承的资源

    在示例中它可能看起来很漂亮,但在我看来,当涉及到真正的代码时,控制器代码很快就变成了意大利面怪物。另一件事是页面视图通常不仅需要资源,还需要其他数据来呈现(侧边栏块等),我仍然必须使用另一种方式来准备它。结合不同的方法使代码更加不可读。最后,我不喜欢使用resource 变量,因为它不太清楚视图是关于什么的。

那么,问题来了。如何保持控制器清洁?

【问题讨论】:

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


    【解决方案1】:
    How do you keep your controllers clean?
    

    通过编写 DRY 代码并在周围散布一些宝石魔法。

    看看你的要点,我想我对大多数东西都有不同的看法。

    1. @cities = Cities.order(:name).limit(10) 正是我认为属于 Rails 控制器的内容,它不违反最小意外原则,它有点相反。实例变量是将变量从控制器传递到视图的默认方式,尽管这是一件非常丑陋的事情。这是“铁路方式”(TM)!

    2. decent_exposure 消除了大部分担忧

    3. 请停止将老式模式应用于 Rails 或 Ruby 代码。在大型应用程序中,它真的很有用,在这些应用程序中,您正在努力与单个控制器方法中的大量代码保持理智。编写干净的代码,彻底测试它,你会在 80% 的时间里都很好。

    4. 不要使用“一刀切”的工具。大多数情况下,您需要编写的配置多于使其工作所需的代码。通过这种事情,它也变得更加复杂。

    【讨论】:

      猜你喜欢
      • 2017-02-11
      • 1970-01-01
      • 1970-01-01
      • 2017-04-14
      • 2016-09-28
      • 1970-01-01
      • 2017-06-10
      • 1970-01-01
      • 2018-08-06
      相关资源
      最近更新 更多