全书目录

第二十八篇:Ruby on Rails 完全指南 —— 城市脚手架工务署宇宙

第十九章:Rails 不等于“胖控制器+胖模型”,Plain Ruby Object 仍然重要

1 分钟 189 字 第 512 / 962 个阅读单元

很多人学 Rails 学到后面会遇到一个很常见的问题:

text
控制器太胖
模型也太胖

这不是 Rails 的原罪。
这是你把整个工务署所有活都塞回两个房间了。

Rails 很欢迎普通 Ruby 对象,也就是 PORO。
复杂业务完全可以抽成服务对象、查询对象、表单对象、策略对象。

比如审批逻辑:

ruby
class PermitApproval
  def self.call(permit, reviewer:)
    Permit.transaction do
      permit.update!(status: "approved", reviewer: reviewer.name)
      PermitApprovedJob.perform_later(permit.id)
    end
  end
end

控制器只协调:

ruby
def approve
  permit = Permit.find(params[:id])
  PermitApproval.call(permit, reviewer: Current.user)

  redirect_to permit, notice: "许可单已批准。"
end

这才是成熟 Rails 项目的味道:

text
Rails 提供城市施工标准
Ruby 对象承载真正业务设计

不要把“Rails 有约定”误解成“我不能做清晰架构”。