很多人学 Rails 学到后面会遇到一个很常见的问题:
控制器太胖
模型也太胖这不是 Rails 的原罪。
这是你把整个工务署所有活都塞回两个房间了。
Rails 很欢迎普通 Ruby 对象,也就是 PORO。
复杂业务完全可以抽成服务对象、查询对象、表单对象、策略对象。
比如审批逻辑:
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控制器只协调:
def approve
permit = Permit.find(params[:id])
PermitApproval.call(permit, reviewer: Current.user)
redirect_to permit, notice: "许可单已批准。"
end这才是成熟 Rails 项目的味道:
Rails 提供城市施工标准
Ruby 对象承载真正业务设计不要把“Rails 有约定”误解成“我不能做清晰架构”。