mcpField
R
rails-stack-conventions

rails-stack-conventions

github.com/midudev开发7.0k55 次安装1 周前更新
代码仓库

关于 rails-stack-conventions

为使用 PostgreSQL、Hotwire 和 Tailwind CSS 的项目生成 Ruby on Rails 代码提供约定。技能强调先编写并验证测试,并指导应用分层、安全处理和常见问题规避。

主要功能

  1. 01测试先行的实现门槛
  2. 02Rails 功能开发流程
  3. 03Hotwire Turbo 与 Stimulus 模式
  4. 04通过预加载避免 N+1 查询
  5. 05Devise 与 Pundit 安全指导

适用场景

  1. 01先写测试再实现 Rails 功能
  2. 02规划控制器、服务对象和视图的改动
  3. 03检查访问控制与查询加载方式

安装

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

$npx skills add https://github.com/midudev/autoskills --skill rails-stack-conventions

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

包含的文件

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

assets/snippets/
eager_loading.rb
n_plus_one_fix_example.rb
service_object.rb
stimulus_controller.js
tailwind_component.html.erb
turbo_frame.html.erb

详细介绍

Rails Stack 约定

为此项目编写或生成代码时,请遵循以下约定。技术栈:Ruby on Rails、PostgreSQL、Hotwire(Turbo + Stimulus)、Tailwind CSS。

风格: 如果项目使用代码检查工具,请以其作为格式规范的准则。对于跨领域设计原则(DRY、YAGNI、结构化日志记录、按目录制定的规则),请使用 rails-code-conventions。

硬性门槛:测试是实现的准入条件

ALL new code MUST have its test written and validated BEFORE implementation.
  1. Write the spec: bundle exec rspec spec/[path]_spec.rb
  2. Verify it FAILS — output must show the feature does not exist yet
  3. Write the implementation code
  4. Verify it PASSES — run the same spec and confirm green
  5. Refactor if needed, keeping tests green
See rspec-best-practices for the full gate cycle.

功能开发工作流

开发典型功能时,按以下顺序组合各层模式:

  1. 模型 — 添加验证、关联和作用域;对循环中使用的任何关联,都使用 includes 预加载
  2. 服务对象 — 将非简单的业务逻辑从控制器中提取出来(参见 ruby-service-objects)
  3. 控制器 — 保持操作精简;将任务委托给服务;响应 turbo_stream 和 html 格式
  4. 视图 / Turbo 配置 — 用 <turbo-frame> 标签包裹动态区域;从控制器广播 turbo_stream 响应
  5. Stimulus — 仅当 Turbo 无法单独处理客户端交互时,才添加控制器
  6. Tailwind — 在视图中应用工具类;将重复模式提取到局部视图或 Stimulus targets 中

在连接到下一层之前,每个步骤都应能独立测试。

关键代码模式

Hotwire:Turbo Frames
<%# Wrap a section to be replaced without a full page reload %>
<turbo-frame id="order-<%= @order.id %>">
  <%= render "orders/details", order: @order %>
</turbo-frame>

<%# Link that targets only this frame %>
<%= link_to "Edit", edit_order_path(@order), data: { turbo_frame: "order-#{@order.id}" } %>
Hotwire:Turbo Streams(从控制器广播)
respond_to do |format|
  format.turbo_stream do
    render turbo_stream: turbo_stream.replace(
      "order_#{@order.id}",
      partial: "orders/order",
      locals: { order: @order }
    )
  end
  format.html { redirect_to @order }
end
避免 N+1 查询 — 预加载
# BAD — triggers one query per order
@orders = Order.where(user: current_user)
@orders.each { |o| o.line_items.count }

# GOOD — single JOIN via includes
@orders = Order.includes(:line_items).where(user: current_user)
服务对象(将复杂业务逻辑移出控制器)
# Controller stays thin — delegate to service
result = Orders::CreateOrder.call(user: current_user, params: order_params)
if result[:success]
  redirect_to result[:order], notice: "Order created"
else
  @order = Order.new(order_params)
  render :new, status: :unprocessable_entity
end

完整的 .call 模式和响应格式请参见 ruby-service-objects。

安全

此项目使用 Devise 进行身份验证,使用 Pundit 进行授权。对于引入访问受控资源的每项功能,都应应用这些机制。

应避免的问题

问题正确做法
在视图中编写业务逻辑使用 helpers、presenters 或 Stimulus 控制器
循环中出现 N+1 查询在循环前使用 includes 预加载
为了“快速”测试而跳过 FactoryBotFixtures 不可靠 — 始终使用 factories
控制器操作包含 15 行以上的业务逻辑将逻辑提取到服务对象中
模型缺少必填字段的验证添加存在性/格式验证
视图中嵌入的 Ruby 条件语句超过 10 行将逻辑移至 presenter 或局部视图
将本应放在 I18n 中的字符串硬编码使用 t() helpers

集成

Skill何时串联使用
rails-code-conventions用于设计原则、结构化日志记录和特定路径规则
rails-code-review根据这些约定审查现有代码时
ruby-service-objects将业务逻辑提取到服务对象中时
rspec-best-practices用于测试约定以及完整的红/绿/重构 TDD 周期
rails-architecture-review需要超出约定范围进行结构审查时

评论

支持 Markdown