ruby-on-rails - español - rails api tutorial
¿Cómo se hace el tiempo relativo en Rails? (11)
Estoy escribiendo una aplicación de Rails, pero parece que no puedo encontrar la manera de hacer el tiempo relativo, es decir, si se le da una determinada clase de tiempo, puede calcular "hace 30 segundos" o "hace 2 días" o si es más largo que un mes "01/09/2008", etc.
Algo como esto funcionaría.
def relative_time(start_time)
diff_seconds = Time.now - start_time
case diff_seconds
when 0 .. 59
puts "#{diff_seconds} seconds ago"
when 60 .. (3600-1)
puts "#{diff_seconds/60} minutes ago"
when 3600 .. (3600*24-1)
puts "#{diff_seconds/3600} hours ago"
when (3600*24) .. (3600*24*30)
puts "#{diff_seconds/(3600*24)} days ago"
else
puts start_time.strftime("%m/%d/%Y")
end
end
Desde la mayoría de las respuestas aquí sugiere time_ago_in_words .
En lugar de usar :
<%= time_ago_in_words(comment.created_at) %>
En rieles, prefiera:
<abbr class="timeago" title="<%= comment.created_at.getutc.iso8601 %>">
<%= comment.created_at.to_s %>
</abbr>
junto con una biblioteca de jQuery http://timeago.yarp.com/ , con el código:
$("abbr.timeago").timeago();
Principal ventaja: el almacenamiento en caché
http://rails-bestpractices.com/posts/2012/02/10/not-use-time_ago_in_words/
Echa un vistazo a los métodos de instancia aquí:
Esto tiene métodos útiles como el de ayer, el de mañana, el comienzo de la semana, el pasado, etc.
Ejemplos:
Time.now.yesterday
Time.now.ago(2.days).end_of_day
Time.now.next_month.beginning_of_month
He escrito esto, pero tengo que verificar los métodos existentes mencionados para ver si son mejores.
module PrettyDate
def to_pretty
a = (Time.now-self).to_i
case a
when 0 then ''just now''
when 1 then ''a second ago''
when 2..59 then a.to_s+'' seconds ago''
when 60..119 then ''a minute ago'' #120 = 2 minutes
when 120..3540 then (a/60).to_i.to_s+'' minutes ago''
when 3541..7100 then ''an hour ago'' # 3600 = 1 hour
when 7101..82800 then ((a+99)/3600).to_i.to_s+'' hours ago''
when 82801..172000 then ''a day ago'' # 86400 = 1 day
when 172001..518400 then ((a+800)/(60*60*24)).to_i.to_s+'' days ago''
when 518400..1036800 then ''a week ago''
else ((a+180000)/(60*60*24*7)).to_i.to_s+'' weeks ago''
end
end
end
Time.send :include, PrettyDate
He escrito una gema que hace esto para los objetos de Rails ActiveRecord. El ejemplo usa created_at, pero también funcionará en updated_at o cualquier cosa con la clase ActiveSupport :: TimeWithZone.
Simplemente instale gema y llame al método "bonito" en su instancia de TimeWithZone.
Otro enfoque es descargar algo de lógica desde el backend y hacer que el navegador haga el trabajo utilizando complementos de Javascript como:
Puedes usar los operadores aritméticos para hacer el tiempo relativo.
Time.now - 2.days
Te daré hace 2 días.
Qué pasa
30.seconds.ago
2.days.ago
¿O algo más por lo que estabas disparando?
Si está construyendo una aplicación Rails, debe usar
Time.zone.now
Time.zone.today
Time.zone.yesterday
Esto le da la hora o la fecha en la zona horaria con la que ha configurado su aplicación Rails.
Por ejemplo, si configura su aplicación para usar UTC, Time.zone.now
siempre estará en tiempo UTC (por ejemplo, no se verá afectado por el cambio de British Summertime).
Calcular el tiempo relativo es fácil, por ejemplo
Time.zone.now - 10.minute
Time.zone.today.days_ago(5)
Solo para aclarar la solución de Andrew Marshall para usar time_ago_in_words
(Para Rails 3.0 y Rails 4.0)
Si estas en una vista
<%= time_ago_in_words(Date.today - 1) %>
Si estas en un controlador
include ActionView::Helpers::DateHelper
def index
@sexy_date = time_ago_in_words(Date.today - 1)
end
Los controladores no tienen el módulo ActionView::Helpers::DateHelper importado de forma predeterminada.
NB: No es "el camino de los rieles" importar ayudantes a sus controladores. Los ayudantes son para ayudar puntos de vista. El método time_ago_in_words se decidió como una entidad de vista en la tríada MVC . (No estoy de acuerdo, pero cuando en Roma ...)
Parece que estás buscando el método time_ago_in_words
(o distance_of_time_in_words
), desde ActiveSupport. Llámalo así:
<%= time_ago_in_words(timestamp) %>