2016-04-26 58 views
0

我基本上试图在设置DateTime值之前得到倒计时的小时数(如果超过24小时,然后是x天)使用DateTime.now但我所有的尝试导致一个错误,我知道我必须做一些喜欢尝试减去浮动和一个字符串或东西的表列...Ruby On Rails - 通过减去DateTime列和DateTime来计算小时/天倒数

我有一个question表和fixture_date列这是一个datetime类型列,我到目前为止试过的:

  • question.fixture_date - DateTime.now
  • 错误:undefined method '-' for nil:NilClass

  • question.fixture_date - Date.today
  • 错误:undefined method '[email protected]' for Tue, 26 Apr 2016:Date Did you mean? -

  • question.fixture_date - Time.now
  • 错误:undefined method '-' for nil:NilClass

Ť嘿所有返回错误,什么是正确的语法?也许这与datetime专栏有关,我应该使用替代方案吗?

+0

什么是错误讯息?顺便说一下'question.fixture_date.class'的结果是什么? –

+0

我的错误信息更新:-)如果我扭转。其中,前两回'预期numeric',最后一个返回'不能零转换成精确number' – classequalsarthur

+0

是啊,这是你的'问题fixture_date问题',只要确保它不为零 –

回答

2

的,因为question.fixture_date不是约会,在您的情况是nilString,所以使用的红宝石STDLIB的Time::parse方法从字符串得到有效的时间,捕获异常时nil

require 'time' 

begin 
    Time.parse(question.fixture_date) - Time.zone.now 
rescue TypeError 
    nil 
end 
+0

啊这很酷:-)但是我怎么把这个写到HTML?除非我做错了,否则不会写入页面。 – classequalsarthur

1

正如我评论,你的错误来自question其中有fixture_date = nil

解释错误消息:

  1. question.fixture_date - DateTime.now

    undefined method '-' for nil:NilClass 
    

    由于question.fixture_date返回nil和方法-不为NilClass存在。为了验证这一点,让我们来看:

    nil.methods.include?(:-) 
    # => false 
    
  2. DateTime.now - question.fixture_date

    TypeError: can't convert nil into an exact number 
    

    由于方法-确实存在DateTime.now,但参数为零无效。为了验证这一点,让我们来看

    Time.now.methods.include?(:-) 
    # => true 
    

综上所述,根本原因就是你fixture_date = nil,尝试修复与简单的代码,例如:

<% if question.fixture_date %> 
    <% delta = question.fixture_date - DateTime.now %> 
    <!-- Your code here to use delta --> 
<% end %> 

否则,如果你想确保fixture_date不是nil一如既往地为它的轨道验证您的Question模型

+0

啊,这是伟大的,感谢信息:-)有没有一种简单的方法来获得倒计时风格的东西工作?像“2天3小时左右”基于减去'datetime' fixture_date和'DateTime.now'代码?我会使用这种方法还是完全不同的东西? – classequalsarthur

+1

只需定义一个视图帮助器来计算它,这是如何计算http://stackoverflow.com/a/2311415/1789479,以下是如何定义视图帮助器方法http://www.rails-dev.com /定制视图辅助细胞功能于导轨-4- –