tutorial rails español ruby-on-rails ruby

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í:

http://apidock.com/rails/Time

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.

https://github.com/brettshollenberger/hublot



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 ...)