【问题标题】:Ruby on rails, MVC, where to put derivative data?Ruby on rails,MVC,衍生数据放在哪里?
【发布时间】:2015-07-06 10:00:30
【问题描述】:

我正在编写一个超级简单的 Web 应用程序,它为不同的事件提供不同的计数器。我的数据库表充满了代表不同事件的记录。该表有 2 个列 namedate

现在,在我展示每个事件的计数器之前,我需要

  1. 计算剩余时间到其date
  2. 并创建一个字符串,该字符串可以写成5d, 4h, 23mcompleted

你们会把这个逻辑放在哪里?请多多包涵,我是初学者。

ps。我正在尝试使用 Ruby on Rails 制作一个合适的 MVC 应用程序

【问题讨论】:

  • 在控制器中计算日期,然后根据值打印在视图中。
  • 在模型中加入尽可能少的逻辑,模型仅用于关系。

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


【解决方案1】:

有时会回答“这会出现在模型、视图还是控制器中?”没有”。

就像其他人所说的 - 您希望控制器尽可能薄。它的工作是中继“事件”并进行其他对象的基本设置。根据传统观点,模型应该封装您的业务逻辑。在 Rails 中,模型通常同时执行持久性和业务逻辑。换句话说,如果你有关于如何操作数据或如何聚合数据的规则,那么它就会出现在模型中。另一方面,人们开始争辩说,管理持久性和业务逻辑对于一个对象来说责任太大了。

您描述的职责是关于呈现价值观。为此,您可以使用 Presenter 或 Decorator 模式。本质上,您创建了一个对象类,其职责是从另一个对象中获取数据并为呈现做准备。 The Draper gem 提供了一些实用程序来执行此操作。

【讨论】:

    【解决方案2】:

    在您的event.rb 中,创建一个名为time_left 的方法(取自https://stackoverflow.com/a/19596579/1489088):

    def self.time_left
      # Calculate time left for event start
      current_time = Time.now
      # date is retrieving the date for your model, but it has to be a datetime field and not a date field.
      seconds_diff = (date - current_time).to_i.abs 
    
      hours = seconds_diff / 3600
      seconds_diff -= hours * 3600
    
      minutes = seconds_diff / 60
      seconds_diff -= minutes * 60
    
      seconds = seconds_diff
    
      "#{hours.to_s.rjust(2, '0')}:#{minutes.to_s.rjust(2, '0')}:#  {seconds.to_s.rjust(2, '0')}"
    end
    

    为什么在您的模型中,仅仅是因为此计算特定于您的事件,并且您希望在此处“玩”您的模型数据并在此处处理您的大部分数据行为。我无法真正深入研究,其他人可以做得更好,如果您搜索它,则有很多关于该主题的资源(例如在 Google 中搜索 "Fat Model, Skinny Controller" )。

    现在假设您希望在每次加载事件页面时计算剩余时间,您必须在控制器中指定它:

    events_controller.rb

    def show
     set_event
     @time_left = @event.time_left
    end
    

    然后基本上在你的视图中调用@time_left。

    【讨论】:

    • 这会返回什么?最后的字符串?是否也可以在模型方法中实际使用return 语句?那我可以说return "#{hours.to_s.rjust(2, '0')}:#{minutes.to_s.rjust(2, '0')}:# {seconds.to_s.rjust(2, '0')}"吗?
    • 您不必在 ruby​​ 中指定 return。该方法将返回最后一行,例如“51:04:04”
    • 您将time_left 定义为类方法(为什么?)并将其作为实例方法调用。这是没有意义的。另外:根据需要的格式,可能会有用于打印剩余时间距离的导轨助手。参见例如distanc_of_time_in_words。这些帮助器在模型中不可用的事实暗示了这种表示逻辑不属于其中的事实。
    • 您好 Jesper,感谢您指出这一点。我承认我对类方法和实例方法还不是很放心,所以如果你能解释一下为什么它“没有意义”那就太好了:-)。否则我选择不使用 distance_of_time_in_words 的原因是输出格式似乎不适合这种情况。 (“5d、4h、23m 或完成”)
    • 所以根据您的评论,最好的解决方案是创建一个自定义视图助手,对吧?
    【解决方案3】:

    我不确定@CaffeineCoder 所说的“在模型中放置尽可能多的最小逻辑,模型仅用于关系”是什么意思,但我会说类似的思路:

    在模型中保留尽可能多的逻辑。

    模型应该包含你所有的业务逻辑,控制器应该尽可能少做,视图应该处理任何与格式化数据和呈现给用户有关的事情。重复的格式可以放在帮助器中,就像视图的一个子部分。

    您没有告诉我们太多有关您的架构的信息,因此我无法就具体细节提供建议,但您可以在 Event 中使用诸如“time_remaining”之类的方法,该方法返回秒数,然后使用帮助程序这个值并返回“5d”或“4h”或其他。

    【讨论】:

      猜你喜欢
      • 2015-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-18
      • 2014-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多