Ruby on Rails 抽象层的探索与实践
1. 全局状态与 Current 属性
在 Ruby on Rails 开发中,全局状态管理是一个重要的话题。例如,下面的代码展示了一个通知作者的方法:
def notify_author
Current.set(user:) do
PostMailer.notify_deleted(post)
end
end
这种做法存在一定的局限性,只有在确保代码块内没有依赖 Current.user 之前的值时才有效,但由于一些原因,我们很难给出这样的保证。为了控制 Current 的使用,可以结合一些约定和代码检查工具,例如遵循以下规则:
- 尽量减少 Current 属性的数量。
- 在同一执行上下文中只写入一次属性。
- 只在少数抽象层中写入(例如,仅在入站层)。
- 只在少数抽象层中读取(且永远不要从模型中读取)。
另外, dry-effects 这个 Ruby 库可以帮助我们更好地处理上下文传递。它实现了代数效应,使用 Reader 效应可以隐式地将上下文从上层抽象层传递到下层。与 Current 属性不同,使用效应需要附加一个行为(包括 Ruby 模块),并且有单独的写入和读取行为,这样我们可以清楚地知道一个对象如何依赖全局状态。同时, Reader 会通过抛出异常来防止读取
超级会员免费看
订阅专栏 解锁全文
65

被折叠的 条评论
为什么被折叠?



