mcpField
L
layered-rails

layered-rails

github.com/palkan开发476188 次安装8 周前更新
代码仓库

关于 layered-rails

layered-rails 是一项将分层架构原则应用于 Rails 开发的技能,提供代码库审计、代码评审、渐进式重构规划和模式选择工作流。

主要功能

  1. 01审计架构和层边界
  2. 02评审代码变更中的违规
  3. 03测试代码是否属于当前层
  4. 04规划渐进式架构改造
  5. 05生成用于 CI 的 ArchSpec 检查

适用场景

  1. 01审计 Rails 代码库
  2. 02检查差异中的层违规
  3. 03规划分阶段重构
  4. 04在 CI 中强制执行边界

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/palkan/layered-rails-skills --skill layered-rails

安装后在 Claude Code 中输入/layered-rails确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

examples/
authorization-to-policy.md
callbacks-to-service.md
complex-input-to-form-object.md
current-from-model.md
god-object-decomposition.md
implicit-to-explicit-state-machine.md
query-to-query-object.md
view-logic-to-presenter.md
references/anti-patterns/
callbacks.md
concerns.md
helpers.md
jobs.md
layer-violations.md
service-objects.md
testing.md
references/core/
architecture-layers.md
extraction-signals.md
specification-test.md
references/gems/
action-policy.md
active-agent.md
active-delivery.md
active-job-performs.md
alba.md
anyway-config.md
archspec.md
rubanok.md
view-component.md
workflow.md
references/patterns/
collaborator-objects.md
concerns.md

详细介绍

分层 Rails

使用分层架构原则设计和审查 Rails 应用。

快速开始

Rails 应用分为四个架构层,采用单向数据流:

┌─────────────────────────────────────────┐
│           PRESENTATION LAYER            │
│   Controllers, Views, Channels, Jobs*   │
│ Forms, Filters, Presenters, Serializers │
└─────────────────────────────────────────┘
                    ↓
┌─────────────────────────────────────────┐
│           APPLICATION LAYER             │
│ Services, Policies, Mailers, Deliveries │
└─────────────────────────────────────────┘
                    ↓
┌─────────────────────────────────────────┐
│             DOMAIN LAYER                │
│  Models, Value Objects, Query Objects   │
└─────────────────────────────────────────┘
                    ↓
┌─────────────────────────────────────────┐
│          INFRASTRUCTURE LAYER           │
│  Active Record, API Clients, Storage    │
└─────────────────────────────────────────┘

* Job 是内部入站入口:从设计上看,它们遵循与控制器相同的规则,但无需处理身份验证和用户输入。

**核心规则:**低层绝不能依赖高层。

如需了解各层的完整职责以及“四项规则”的深入解析,请参阅架构分层参考。

此技能的用途

以下情况可使用此技能:

  1. 分析代码库——使用架构分析进行全面审计,或使用服务层审计、回调分析或巨型对象分析聚焦具体问题。
  2. 审查代码变更——针对 diff、文件或分支运行代码审查工作流。
  3. 运行规范测试——针对单个文件或目录使用规范测试工作流,评估代码是否属于当前所在层。
  4. 规划渐进式采用——使用分层改造计划工作流生成分阶段路线图,聚焦于“引入授权”或“拆解巨型对象”等目标。
  5. 规划功能——我会将以下分层原则应用到你即将编写的代码中。
  6. 实现特定模式——例如授权、通知、视图组件、AI 集成等。请参阅下文的模式目录和主题参考。

在安装了此技能插件的 Claude Code 中(/plugin install layered-rails@layered-rails-skills),上述每个工作流也可通过斜杠命令调用——请参阅斜杠命令。在加载了此技能的任何环境中,也可以使用自然语言请求(“使用 layered-rails 审查此文件”“对 app/models/order.rb 运行规范测试”)。

工作流

此技能中包含的可复用流程。读取文件并将其应用到目标代码:

  • 架构分析——全面审计 Rails 代码库的分层架构
  • 代码审查——审查 diff 或文件集,检查是否违反分层规则
  • 规范测试——评估代码是否属于当前所在层
  • 服务层审计——深入审计 app/services/ 和类似服务的类(按集群提出建议、检查契约和分层规范)
  • 回调分析——评估 Active Record 回调并寻找可提取的候选项
  • 巨型对象分析——识别过于庞大的模型并提出拆解建议
  • 渐进式分层改造计划——采用分层模式的渐进路线图
  • ArchSpec 设置——生成并验证定制的 Archspec.rb,在 CI 中强制执行分层边界

核心原则

四项规则
  1. 单向数据流——数据只能从上向下流动
  2. 禁止反向依赖——低层绝不依赖高层
  3. 抽象边界——每个抽象只能属于一个层
  4. 尽量减少连接——层间连接越少,耦合越松散
常见违规
违规示例修复方法
模型使用 Current模型中的 Current.user将用户作为显式参数传入
服务接受请求服务中的 param :request从请求中提取值对象
控制器包含业务逻辑在 action 中进行定价计算提取到服务或模型中
贫血模型所有逻辑都在服务中将领域逻辑保留在模型中
类别参考
分层违规(模型中使用 Current、服务中使用 request、模型中发送通知、控制器中包含业务逻辑)layer-violations.md
服务对象(贫血模型、杂乱对象集合、过早抽象)service-objects.md
回调(操作回调、跳过回调、控制标志)callbacks.md
Concern(按代码切片、过度膨胀)concerns.md
辅助方法(在辅助方法中构建 HTML)helpers.md
作业(贫血作业)jobs.md
测试(测试错误的层)testing.md
规范测试

如果对象的规范描述了超出其抽象层主要职责的功能,就应将这些功能提取到更底层。

应用方法:

  1. 列出代码处理的职责
  2. 对照该层的主要职责评估每项职责
  3. 将位置不当的职责提取到合适的层

详细指南请参阅 规范测试参考。

模式目录

模式层适用场景参考
服务对象应用层编排领域操作service-objects.md
查询对象领域层复杂且可复用的查询query-objects.md
表单对象表现层多模型表单、复杂验证form-objects.md
筛选对象表现层转换请求参数filter-objects.md
展示器表现层视图专属逻辑、多个模型presenters.md
序列化器表现层格式化 API 响应serializers.md
策略对象应用层授权决策policy-objects.md
值对象领域层不可变、无身份标识的概念value-objects.md
协作者对象领域层在类型化委托对象中封装某个模型的一部分行为collaborator-objects.md
状态机领域层状态、事件、转换state-machines.md
Concern领域层提取共享行为concerns.md
仓储领域层最后手段 — 在 AR 作用域(简单查询)和查询对象(构建查询)都无法满足需求后,返回由 AR 数据映射而来的自定义领域对象repositories.md
模式选择指南

“这段代码应该放在哪里?”

如果你有……可以考虑……
复杂的多模型表单表单对象(Form Object)
请求参数筛选/转换筛选对象(Filter Object)
特定于视图的格式化Presenter
多处使用的复杂数据库查询查询对象(Query Object)
涉及多个模型的业务操作服务对象(作为候置区)
授权规则策略对象(Policy Object)
多渠道通知交付对象(Delivery Object,Active Delivery)

请记住: 服务是代码的“候置区”,用于暂存代码,直到出现合适的抽象。不要让 app/services 变成杂乱对象的集合。

重构场景

最常见分层改造的规范前后转换示例。分层改造计划工作流 会在提出阶段方案时将这些示例用作参考模板。

场景目标区域参考
将回调提取到服务中callbacks、after_create 链callbacks-to-service.md
将授权提取到策略中authorization、permissionsauthorization-to-policy.md
将查询逻辑提取到查询对象中复杂作用域、报表查询query-to-query-object.md
将 Current 从模型中提取出来领域中的 Current.*current-from-model.md
使用关联对象拆分上帝对象上帝模型、大型 User/Accountgod-object-decomposition.md
替换隐式状态机基于时间戳的状态implicit-to-explicit-state-machine.md
将视图逻辑提取到 Presenter 中模板逻辑、格式化view-logic-to-presenter.md
为复杂输入使用表单对象臃肿控制器、多模型表单complex-input-to-form-object.md

斜杠命令

仅当此技能作为 Claude Code 插件安装(/plugin install layered-rails@layered-rails-skills)时,才能使用以下斜杠命令。如果通过 skills.sh 或其他方式安装此技能,且只提供 skills/layered-rails/ 而不包含外层插件,这些命令将不可用——请直接调用相应的工作流(参见工作流),或直接用自然语言提出请求。

命令工作流用途
/layered-rails:reviewreview从分层架构的角度审查代码变更
/layered-rails:spec-testspec-test对指定文件运行规范测试
/layered-rails:analyzeanalyze对整个代码库进行抽象层分析
/layered-rails:analyze-servicesanalyze-services审查 app/services/ 和类似服务的类——约定、分类、分层规范、测试影响
/layered-rails:analyze-callbacksanalyze-callbacks评估模型回调,寻找可提取项
/layered-rails:analyze-godsanalyze-gods通过变更频率 × 复杂度查找上帝对象
/layered-rails:plan [goal]plan规划逐步采用分层模式
/layered-rails:archspecarchspec生成并验证 Archspec.rb,以便在 CI 中强制执行分层边界

主题参考

深入了解特定主题:

主题参考
授权(RBAC、ABAC、策略)authorization.md
通知(多渠道交付)notifications.md
视图组件view-components.md
AI 集成(LLM、Agent、RAG、MCP)ai-integration.md
配置configuration.md
回调(评分、提取)callbacks.md
当前属性current-attributes.md
插桩(日志、指标)instrumentation.md

Gem 参考

库专属指南:

Gem用途参考
action_policy授权框架action-policy.md
view_component组件框架view-component.md
anyway_config类型化配置anyway-config.md
active_delivery多渠道通知active-delivery.md
albaJSON 序列化alba.md
workflow状态机workflow.md
rubanok筛选/转换 DSLrubanok.md
active_agentAI Agent 框架active-agent.md
active_job-performs消除贫血任务active-job-performs.md
archspec在 CI 中强制执行分层边界(参考 Archspec.rb 配置)archspec.md

提取信号

何时从模型中提取:

信号指标操作
上帝对象高变更率 × 复杂度拆分为 concerns、委托对象或独立模型
操作回调评分 1-2/5提取到服务或事件处理器
按代码切片的 concern按制品类型分组转换为行为型 concern 或提取
当前依赖模型读取 Current.*将其作为显式参数传递

回调评分:

类型评分保留?
转换器(计算值)5/5是
规范化器(清理输入)4/5是
实用工具(计数器缓存)4/5是
观察器(副作用)2/5也许
操作(业务步骤)1/5提取

详细指南请参阅提取信号参考。

模型组织

模型文件中的建议顺序:

class User < ApplicationRecord
  # 1. Gems/DSL extensions
  has_secure_password

  # 2. Associations
  belongs_to :account
  has_many :posts

  # 3. Enums
  enum :status, { pending: 0, active: 1 }

  # 4. Normalization
  normalizes :email, with: -> { _1.strip.downcase }

  # 5. Validations
  validates :email, presence: true

  # 6. Scopes
  scope :active, -> { where(status: :active) }

  # 7. Callbacks (transformers only)
  before_validation :set_defaults

  # 8. Delegations
  delegate :name, to: :account, prefix: true

  # 9. Public methods
  def full_name = "#{first_name} #{last_name}"

  # 10. Private methods
  private

  def set_defaults
    self.locale ||= I18n.default_locale
  end
end

成功检查清单

分层良好的代码:

  • 没有反向依赖(低层不依赖高层)
  • 模型不访问 Current 属性
  • 服务不接受请求对象
  • 控制器保持精简(仅处理 HTTP 相关事项)
  • 领域逻辑位于模型中,而非服务中
  • 回调评分为 4+ 或已提取
  • Concerns 与行为相关,而非按代码切片
  • 抽象不跨越多个层
  • 测试验证各层恰当的职责

指南

  • 使用领域语言 - 按业务概念为模型命名(Participant,而非 User;Cloud,而非 GeneratedImage)
  • 模式优先于抽象 - 让代码经过时间检验后再提取;过早抽象比重复更糟
  • 把服务当作候客室 - 不要让 app/services 成为代码的永久居所
  • 显式优于隐式 - 优先使用显式参数,而非 Current 属性
  • 提取阈值 - 方法超过 15 行或调用外部 API 时,考虑提取

评论

支持 Markdown