我正在写一个超级简单的Web应用程序,为不同的事件提供不同的计数器。我的数据库表中充满了代表不同事件的记录。表中有2个colums name
和date
Ruby on Rails,MVC,在哪里放置衍生数据?
现在摆在我能呈现计数器每一个事件,我需要
- 计算时间留给其
date
- ,使一个字符串,要么说了什么像
5d, 4h, 23m
或completed
你们会把这个逻辑放在哪里?请忍受我,我是一个初学者。
ps。我试图用Ruby on Rails制作一个合适的MVC应用程序
我正在写一个超级简单的Web应用程序,为不同的事件提供不同的计数器。我的数据库表中充满了代表不同事件的记录。表中有2个colums name
和date
Ruby on Rails,MVC,在哪里放置衍生数据?
现在摆在我能呈现计数器每一个事件,我需要
date
5d, 4h, 23m
或completed
你们会把这个逻辑放在哪里?请忍受我,我是一个初学者。
ps。我试图用Ruby on Rails制作一个合适的MVC应用程序
在你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' )}“'? – sjbuysse
您不必在红宝石中指定回报。该方法将返回最后一行,例如类似“51:04:04” –
您将'time_left'定义为类方法(为什么?)并将其称为实例方法。这没有意义。另外:根据需要什么样的格式,可能会有铁轨助手在剩下的时间内打印距离。参见例如[distanc_of_time_in_words](http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html)。事实上,这些助手在模型中不可用暗示事实上这种表示逻辑不属于它。 – Jesper
我不确定@CaffeineCoder的意思是“在模型中放置尽可能多的最小逻辑,模型仅用于关系”,但沿着类似的路线会说:
尽可能在您的模型尽可能多的逻辑。
模型应该包含所有的业务逻辑,控制器应该尽可能少,视图应该处理任何与格式化数据并将其呈现给用户的事情。格式的重复位可以放在帮助器中,就像View的一个子部分。
你不会告诉我们很多关于你的模式,所以我不能告诉你具体的细节,但是你可以例如在事件中有一个方法,如“time_remaining”,它返回几秒钟,然后有帮助者取这个值并返回“5d”或“4h”或其他。
有时候,答案是“这是否在模型,视图或控制器中进行?”没有”。
就像其他人所说的 - 你希望控制器尽可能薄。它的工作是传达“事件”并做其他对象的基本设置。根据传统的观点,模型应该封装你的业务逻辑。在Rails中,模型通常既执行持久性又执行业务逻辑。换句话说,如果您有关于如何操纵数据或如何对数据进行汇总的规则,那么该模型就是如此。另一方面,人们开始争论说,管理持久性和业务逻辑对于一个对象来说太过责任。
您描述的责任是关于呈现值。要做到这一点,你可以使用Presenter或Decorator模式。实质上,您创建一个对象类,其职责是从另一个对象获取数据并为展示做好准备。 The Draper gem提供了一些实用工具。
计算控制器中的日期,然后根据您可以在视图中打印的值。 –
在模型中放置最少的逻辑,模型仅用于关系。 –