默认的 Rails 4 项目生成器现在在控制器和模型下创建目录“关注”。我找到了一些关于如何使用路由问题的解释,但没有找到关于控制器或模型的解释。
我很确定这与社区当前的“DCI趋势”有关,并想尝试一下。
问题是,我应该如何使用此功能,是否有关于如何定义命名/类层次结构以使其工作的约定?如何在模型或控制器中包含关注点?
所以我自己发现了。它实际上是一个非常简单但功能强大的概念。它与代码重用有关,如下例所示。基本上,这个想法是提取常见和/或特定于上下文的代码块,以清理模型并避免它们变得过于臃肿和混乱。
作为示例,我将放置一个众所周知的模式,可标记模式:
# app/models/product.rb class Product include Taggable ... end # app/models/concerns/taggable.rb # notice that the file name has to match the module name # (applying Rails conventions for autoloading) module Taggable extend ActiveSupport::Concern included do has_many :taggings, as: :taggable has_many :tags, through: :taggings class_attribute :tag_limit end def tags_string tags.map(&:name).join(', ') end def tags_string=(tag_string) tag_names = tag_string.to_s.split(', ') tag_names.each do |tag_name| tags.build(name: tag_name) end end # methods defined here are going to extend the class, not the instance of it module ClassMethods def tag_limit(value) self.tag_limit_value = value end end end
因此,按照产品示例,您可以将 Taggable 添加到您想要的任何类并共享其功能。
DHH很好地解释了这一点:
在 Rails 4 中,我们将邀请程序员使用默认的 app/models/concerns 和 app/controllers/concerns 目录,这些目录自动成为加载路径的一部分。与 ActiveSupport::Concern 包装器一起,它的支持足以使这种轻量级分解机制大放异彩。