gpt4 book ai didi

ruby-on-rails - 清洁 Controller : preparing data for views

转载 作者:行者123 更新时间:2023-12-05 04:17:39 29 4
gpt4 key购买 nike

假设我有一个 Controller ,其中包含一个呈现 View 的操作。 View 需要数据来呈现。我知道以下方法来准备并将其发送到 View :

  1. 使用实例变量

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

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

    1. 它使 Action 代码变胖,不仅负责 Controller 逻辑,还负责数据准备。
    2. View 需要通过实例变量访问这些数据——这些@-变量打破了最小惊讶原则。
  2. 使用辅助方法

    class CitiesController < ApplicationController
    helper_method :cities

    def index
    end

    def cities
    @cities ||= Cities.order(:name).limit(10)
    end
    end

    这是我最喜欢的方式。它保持操作方法干净,所以我可以在那里实现 Controller 逻辑,而不是将它与数据准备混合在一个方法中。此外,无需在 View 中使用神秘的实例变量,从而使它们相互隔离。然而:

    1. 数据准备仍在 Controller 中。当有很多这些辅助方法时,尤其是当它们与不同的操作/ View 相关时,它变得不可读。
    2. 每个辅助方法都需要有一个唯一的名称。比如说,我不能有一个名为 products 的方法,它会为不同的操作返回不同的数据(当然,我可以在一个方法中完成,但它看起来很难看)。
  3. 使用门面模式

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

  4. 使用继承的资源

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

所以,问题来了。您如何保持 Controller 清洁?

最佳答案

How do you keep your controllers clean?

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

看了你的要点,我想我对大部分内容都有不同的看法。

  1. @cities = Cities.order(:name).limit(10) 正是我认为属于 Rails Controller 的东西,它没有违反最小惊喜原则,它是有点相反。实例变量是将变量从 Controller 传递到 View 的默认方式,尽管这是一件非常丑陋的事情。这就是“rails 方式”(TM)!

  2. decent_exposure消除了大部分这些顾虑

  3. 请停止将老派模式应用于 Rails 或 Ruby 代码。它真的只在大型应用程序中有用,在这些应用程序中,您正在努力保持理智地处理单个 Controller 方法中的代码量。编写干净的代码,彻底测试它,80% 的时间你会没问题。

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

关于ruby-on-rails - 清洁 Controller : preparing data for views,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21245926/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com