Ruby中匿名块转发(&block)工作原理及Rails场景疑问解答
Rails中around_action里&block的含义
代码示例
around_action :set_time_zone, if: :current_user private def set_time_zone(&block) Time.use_zone(current_user.time_zone, &block) end
用户问题
我的问题是:在此上下文中,&block代表什么?
我的理解是它代表我们将时区设置为用户时区的持续时长,之后会恢复为应用默认时区。这种情况下,它是不是yield的执行时长?
解答
在这个Rails的around_action上下文里,&block就是整个请求的核心业务逻辑代码块——也就是从控制器目标action方法执行,到渲染视图、返回响应的全部处理流程。
你的理解方向完全正确:Time.use_zone会先把当前线程的时区切换为用户选择的时区,接着执行这个block包含的所有代码,等block执行完毕(即整个请求处理完成),会自动把时区恢复回应用的默认值。
它确实对应yield的执行范围,因为around_action的工作机制就是把原本要执行的控制器完整流程打包成一个代码块,传递给你定义的set_time_zone方法。你将这个代码块传给Time.use_zone,就等同于让整个请求处理过程都在用户时区的上下文里运行,执行结束后自动还原时区。
内容的提问来源于stack exchange,提问作者elabmot
相关产品推荐
相关产品推荐

