【问题标题】:Format datetime in model in rails在rails中的模型中格式化日期时间
【发布时间】:2015-02-20 10:51:22
【问题描述】:
我有一个将日期时间打印为 #{@event.starts_at.strftime("%m/%d/%Y %H:%M")} 的视图。所以每次打印starts_at时,我都必须在视图中使用strftime。我需要找到一种方法将方法添加到我的“事件”模型中,以便每次打印 event.starts_at 或 event.method_name(starts_at) 时自动格式化日期
【问题讨论】:
标签:
ruby-on-rails
date
methods
model
formatting
【解决方案1】:
你可以像下面这样覆盖getter:
class Event < ActiveRecord::Base
def starts_at
attributes['starts_at'].strftime("%m/%d/%Y %H:%M")
end
end
考虑到属性散列必须使用字符串而不是符号。
也就是说,如果您的应用尝试国际化,这会锁定您,因为时间格式因地区而异
您可以为此使用 rails I18n:
de.yml
de:
time:
formats:
default: '%A, %d. %B %Y, %H:%M Uhr'
long: '%A, %d. %B %Y, %H:%M Uhr'
short: '%d. %B, %H:%M Uhr'
very_short: '%d.%m.%Y, %H:%M Uhr'
你可以使用:
> I18n.localize Event.first.starts_at, format: :very_short
# => "26.11.2012, 10:35 Uhr"
localize 方法的别名为 I18n.l
它将使用正确的(如果已定义)
【解决方案2】:
您可以添加方法,但它会污染模型与视图相关的逻辑。最好的方法是为此目的创建装饰器,如果您不熟悉装饰器,则可以将其添加到模型中。
def starts_at_format format = "%m/%d/%Y %H:%M"
starts_at.strftime(format)
end
现在你可以使用starts_at_format,它会自动格式化日期
format 具有默认值,因此如果以后需要使用其他格式,只需传递参数即可。
你可以这样使用:
starts_at_format
或
starts_at_format("%m %d %b") # define format
【解决方案3】:
感谢您的回答。我虽然通过将格式添加到初始化程序中找到了一个并解决了问题
【解决方案4】:
考虑使用带有draper 的装饰器。
只需创建装饰器
class EventDecorator < Draper::Decorator
delegate_all
def starts_at
object.starts_at.strftime("%m/%d/%Y %H:%M")
end
end
在控制器中做类似的事情
@event = Event.find(params[:id]).decorate
也可以用于多个对象
@events = Event.all.decorate
并且在视图中它会自动按照您的装饰方式提供服务;)