gpt4 book ai didi

ruby-on-rails - 用另一个类的方法包装一个对象

转载 作者:数据小太阳 更新时间:2023-10-29 08:28:50 25 4
gpt4 key购买 nike

假设我有一个名为 Article 的模型:

class Article < ActiveRecord::Base
end

然后我有一个旨在向文章对象(装饰器)添加行为的类:

class ArticleDecorator

def format_title
end

end

如果我想扩展文章对象的行为,我可以使 ArticleDecorator 成为一个模块,然后调用 article.extend(ArticleDecorator),但我更喜欢这样:

article = ArticleDecorator.decorate(Article.top_articles.first) # for single object

articles = ArticleDecorator.decorate(Article.all) # for collection of objects

我将如何实现这个装饰方法?

最佳答案

你到底想从 decorate 方法中得到什么?它应该简单地向传递的对象添加一些新方法还是应该自动用相应的格式方法包装这些对象的方法?为什么您希望 ArticleDecorator 成为一个类而不仅仅是一个模块?

更新:

nathanvda 的解决方案似乎是您所需要的,但我建议您使用更简洁的版本:

module ArticleDecorator

def format_title
"#{title} [decorated]"
end

def self.decorate(object_or_objects_to_decorate)
object_or_objects_to_decorate.tap do |objects|
Array(objects).each { |obj| obj.extend ArticleDecorator }
end
end

end

它做同样的事情,但是:

  1. 避免检查依赖于 Kernel#Array 方法的参数类型。
  2. 直接调用Object#extend(这是一个公共(public)方法,所以不需要通过send调用它)。
  3. Object#extend 仅包含实例方法,因此我们可以将它们直接放在 ArticleDecorator 中,而无需用另一个模块包装它们。

关于ruby-on-rails - 用另一个类的方法包装一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8016106/

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