Ruby Rails 3-更灵活的时间和文字

Ruby Rails 3-更灵活的时间和文字,ruby,ruby-on-rails-3,Ruby,Ruby On Rails 3,我认为:到期 但是,与大多数time_ago_的用例不同,换句话说,我需要支持time ago和time AHEAD。由于到期日可以是过期(时间之前)和即将到来(时间之前),我如何有条件地显示它,以便如果它是过期的,上面的代码将输出“x天前到期”,如果它是在未来到期的,则输出“x天后到期”从外观上看,您正在使用erb模板引擎,您可以在视图逻辑中通过使用=符号来执行if条件,这样您就可以执行类似的操作 <% if time_ago < Time.now %> <%= tim

我认为:
到期


但是,与大多数time_ago_的用例不同,换句话说,我需要支持time ago和time AHEAD。由于到期日可以是过期(时间之前)和即将到来(时间之前),我如何有条件地显示它,以便如果它是过期的,上面的代码将输出“x天前到期”,如果它是在未来到期的,则输出“x天后到期”

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

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

应该给你一个做什么的主意。尽管我相信更好的做法是将其移动到rails应用程序的模型部分。我的共同公理是胖模型瘦控制器,但这更多的是建议,而不是规则

编辑


如果Alex在下面的评论中提到,这可能会出现在助手方法中,而不是应用程序的模型部分

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

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

应该给你一个做什么的主意。尽管我相信更好的做法是将其移动到rails应用程序的模型部分。我的共同公理是胖模型瘦控制器,但这更多的是建议,而不是规则

编辑

Alex在下面的评论中提到过,这可能应该放在助手方法中,而不是应用程序的模型部分,在您的模型中有:

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
class-SomeclassTime.new()
todo-Time.new()
其他的
Time.new()-todo.due
终止
终止
时间差。strftime(“%I:%M%p”)#返回此值。
终止
在你看来:

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

Where @db_record is a row in the database table for the model in question.

其中@db_record是相关模型的数据库表中的一行。
在您的型号中:

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
class-SomeclassTime.new()
todo-Time.new()
其他的
Time.new()-todo.due
终止
终止
时间差。strftime(“%I:%M%p”)#返回此值。
终止
在你看来:

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

Where @db_record is a row in the database table for the model in question.

其中@db_record是相关模型的数据库表中的一行。

您可以创建自己的助手,如下所示:

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

您可以创建自己的帮助器,如下所示:

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

如果您确实要处理自然语言日期时间解析,我建议

它有许多日期时间解析的方法


HTH

如果您要处理自然语言日期时间解析,我建议您

它有许多日期时间解析的方法



HTH

“胖模型瘦控制器”的确如此,但在本例中,这是视图逻辑。如果要重构它,它应该放在一个助手中,而不是模型中。而且,第一行可能应该是
,现在我想起来了,我必须同意你的意见,并将编辑我的回答。这是一篇很好的文章,为德语解释了这一点:“胖模型瘦控制器”,确实如此,但在这种情况下,这就是视图逻辑。如果要进行重构,它应该放在助手中,而不是模型中。而且,第一行应该是
,现在我想起来了,我必须同意你的意见,并编辑我的回答。这篇文章很好地用德语解释了这一点:我有一个初学者的问题,但是在助手中编写代码有什么好处,而不是在模型中?或者您是说在模型中作为“助手方法”编写上述代码?很抱歉造成混淆。@TrevanHetzel Rails基于MVC,保持视图“干净”的一种方法是将代码和计算移动到帮助和MVC模式的其他部分。谢谢,这很有意义。所以实际上我可以跳过助手,把我所有的计算代码都放在控制器里?好吧,如果我选择的话,我会把它放在应用程序的一部分。我会在谷歌上搜索“胖模特瘦控制器”关于这一点有各种各样的讨论如果你使用这个应用来学习rails/ruby,那么我会尝试遵循最佳实践,因为它会让你的程序和你变得更好。另一方面,如果这是一个产品,你正试图推动它也许最好只是离开它,只是让它的工作,我有一种初学者的问题,但什么是在一个助手编写代码的优势,而不是在模型?或者您是说在模型中作为“助手方法”编写上述代码?很抱歉造成混淆。@TrevanHetzel Rails基于MVC,保持视图“干净”的一种方法是将代码和计算移动到帮助和MVC模式的其他部分。谢谢,这很有意义。所以实际上我可以跳过助手,把我所有的计算代码都放在控制器里?好吧,如果我选择的话,我会把它放在应用程序的一部分。我会在谷歌上搜索“胖模特瘦控制器”关于这一点有各种各样的讨论如果你使用这个应用来学习rails/ruby,那么我会尝试遵循最佳实践,因为它会让你的程序和你变得更好。另一方面,如果这是一个您正试图推动的产品,那么最好让它保持原样,让它工作。您在哪里定义
@time\u difference
变量?您在哪里定义
@time\u difference
变量?