gpt4 book ai didi

ruby-on-rails - 编写事件装饰器 DRY

转载 作者:太空宇宙 更新时间:2023-11-03 17:09:12 25 4
gpt4 key购买 nike

我正在使用 ActiveDecorator:https://github.com/amatsuda/active_decorator

在编写我的 UserDecorator 时,我发现它有很多重叠。只需装饰 datetime 但我必须重复编写很多装饰器。

# frozen_string_literal: true

module UserDecorator
def created_at_datetime
created_at&.strftime '%Y/%m/%d %H:%M:%S'
end

def confirmed_at_datetime
confirmed_at&.strftime '%Y/%m/%d %H:%M:%S'
end

def locked_at_datetime
locked_at&.strftime '%Y/%m/%d %H:%M:%S'
end

def current_sign_in_at_datetime
current_sign_in_at&.strftime '%Y/%m/%d %H:%M:%S'
end

def last_sign_in_at_datetime
last_sign_in_at&.strftime '%Y/%m/%d %H:%M:%S'
end
end

猜猜看,在我的 AdminDecorator 上我有完全相同的字段。我是否必须将所有这些再次复制到 AdminDecorator?大家有什么建议吗?

引用:https://github.com/amatsuda/active_decorator/issues/104

最佳答案

我不使用 active_decorator,但我想我会很想创建一个 DatetimeDecorator,例如:

module DatetimeDecorator

%i(
created_at
confirmed_at
locked_at
current_sign_in_at
last_sign_in_at
).each do |attr_sym|
define_method("#{attr_sym}_datetime") do
send(attr_sym)&.strftime '%Y/%m/%m %H:%M:%S'
end
end

end

无论何时包含此模块,您都会获得之前在 UserDecorator 中定义的五个方法,每个方法都使用相同的格式化代码。

现在,要包含该模块,请使用 included Hook 。像这样的东西:

module UserDecorator

self.included(base)
base.class_eval do
include DatetimeDecorator
end
end

end

module AdminDecorator

self.included(base)
base.class_eval do
include DatetimeDecorator
end
end

end

现在您的 UserDecorator 和您的 AdminDecorator 都有您之前在 UserDecorator 中定义的五个方法。

这是未经测试的,因此您可能需要稍微调整一下。

关于ruby-on-rails - 编写事件装饰器 DRY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56844902/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com