2015-07-06 21 views
0

我正在写一个超级简单的Web应用程序,为不同的事件提供不同的计数器。我的数据库表中充满了代表不同事件的记录。表中有2个colums namedateRuby on Rails,MVC,在哪里放置衍生数据?

现在摆在我能呈现计数器每一个事件,我需要

  1. 计算时间留给其date
  2. ,使一个字符串,要么说了什么像5d, 4h, 23mcompleted

你们会把这个逻辑放在哪里?请忍受我,我是一个初学者。

ps。我试图用Ruby on Rails制作一个合适的MVC应用程序

+0

计算控制器中的日期,然后根据您可以在视图中打印的值。 –

+0

在模型中放置最少的逻辑,模型仅用于关系。 –

回答

0

在你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您视图。

+0

这将返回什么?字符串在结尾? 是否有可能在模型方法中实际使用'return'语句?所以我可以说'return'#{hours.to_s.rjust(2,'0')}:#{minutes.to_s.rjust(2,'0')}:#{seconds.to_s.rjust(2,' 0' )}“'? – sjbuysse

+0

您不必在红宝石中指定回报。该方法将返回最后一行,例如类似“51:04:04” –

+0

您将'time_left'定义为类方法(为什么?)并将其称为实例方法。这没有意义。另外:根据需要什么样的格式,可能会有铁轨助手在剩下的时间内打印距离。参见例如[distanc_of_time_in_words](http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html)。事实上,这些助手在模型中不可用暗示事实上这种表示逻辑不属于它。 – Jesper

0

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

尽可能在您的模型尽可能多的逻辑。

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

你不会告诉我们很多关于你的模式,所以我不能告诉你具体的细节,但是你可以例如在事件中有一个方法,如“time_remaining”,它返回几秒钟,然后有帮助者取这个值并返回“5d”或“4h”或其他。

1

有时候,答案是“这是否在模型,视图或控制器中进行?”没有”。

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

您描述的责任是关于呈现值。要做到这一点,你可以使用Presenter或Decorator模式。实质上,您创建一个对象类,其职责是从另一个对象获取数据并为展示做好准备。 The Draper gem提供了一些实用工具。