我认为这是:Due <%= time_ago_in_words(todo.due) %>
但与 time_ago_in_words 的大多数用例不同,我需要支持 time AGO 和 time AHEAD。由于到期日可能已过期(时间前)和即将到来(提前时间),我如何有条件地显示它,所以如果它已过期,上面的代码将输出“Due x days ago”,如果它在未来到期输出“在 x 天内到期”?
我认为这是:Due <%= time_ago_in_words(todo.due) %>
但与 time_ago_in_words 的大多数用例不同,我需要支持 time AGO 和 time AHEAD。由于到期日可能已过期(时间前)和即将到来(提前时间),我如何有条件地显示它,所以如果它已过期,上面的代码将输出“Due x days ago”,如果它在未来到期输出“在 x 天内到期”?
从外观上看,您正在使用 erb 模板引擎,您可以通过省略 = 符号来执行视图逻辑中的 if 条件所以您可以执行类似这样的操作
<% if time_ago < Time.now %>
<%= time_ago_in_words(todo.due) %>
<% else %>
<%= time_ahead_in_words(todo.due) %>
<% end %>
应该让你知道该怎么做。虽然我相信更好的做法可能是将其移至 Rails 应用程序的模型部分。我常见的公理是 Fat Models 瘦控制器,但这更多的是建议而不是规则。
编辑
亚历克斯是否在下面的评论中提到这可能应该使用辅助方法而不是应用程序的模型部分
您可以像这样创建自己的助手:
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
在您的模型中有:
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.