1

我认为这是:Due <%= time_ago_in_words(todo.due) %>

但与 time_ago_in_words 的大多数用例不同,我需要支持 time AGO 和 time AHEAD。由于到期日可能已过期(时间前)和即将到来(提前时间),我如何有条件地显示它,所以如果它已过期,上面的代码将输出“Due x days ago”,如果它在未来到期输出“在 x 天内到期”?

4

4 回答 4

3

从外观上看,您正在使用 erb 模板引擎,您可以通过省略 = 符号来执行视图逻辑中的 if 条件所以您可以执行类似这样的操作

<% if time_ago < Time.now %>
<%= time_ago_in_words(todo.due) %>
<% else %>
<%= time_ahead_in_words(todo.due) %>
<% end %>

应该让你知道该怎么做。虽然我相信更好的做法可能是将其移至 Rails 应用程序的模型部分。我常见的公理是 Fat Models 瘦控制器,但这更多的是建议而不是规则。

编辑

亚历克斯是否在下面的评论中提到这可能应该使用辅助方法而不是应用程序的模型部分

于 2012-12-26T18:09:57.877 回答
1

您可以像这样创建自己的助手:

def time_diff_in_words(from_time)
  # compute days difference from now
  days_delta = (Time.now - from_time) / (24 * 60 * 60)  
  # render text
  days = pluralize(days_delta, 'day')
  days_delta > 0 ? "Due #{days} ago" : "Due in #{days}"       
end
于 2012-12-26T18:19:27.360 回答
1

在您的模型中有:

class Someclass < ActiveRecord::Base

attr_reader :time_diff

def time_diff
    time_difference = 
      if todo.due > Time.new()
        todo - Time.new()
      else
        Time.new() - todo.due
      end
    end
    time_difference.strftime("%I:%M%p")  # This gets returned.  
end

在您看来:

<%= time_in_words(@db_record.time_diff) %>

Where @db_record is a row in the database table for the model in question.
于 2012-12-26T18:16:58.697 回答
0

如果您确实处理自然语言日期时间解析,我推荐慢性宝石

它有多种日期时间解析方式

高温高压

于 2012-12-26T19:49:33.233 回答