我使用 around_action
将 Rails 应用程序的时区临时设置为当前用户选择的时区。我的代码如下所示:
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
的持续时间是?
最佳答案
根据https://api.rubyonrails.org/classes/Time.html#method-c-use_zone :
use_zone(time_zone)
Allows override of Time.zone locally inside supplied block; resets Time.zone to existing value when done.
# File activesupport/lib/active_support/core_ext/time/zones.rb, line 61 def use_zone(time_zone) new_zone = find_zone!(time_zone) begin old_zone, ::Time.zone = ::Time.zone, new_zone yield ensure ::Time.zone = old_zone end end
因此,时区的更改仅在您传递给此方法的 block 内可见。
看一下:
Time.zone = "London"
Time.use_zone("Eastern Time (US & Canada)") do
puts Time.zone
end
puts Time.zone
输出是:
(GMT-05:00) Eastern Time (US & Canada) # inside the block
(GMT+00:00) London # outside
关于ruby-on-rails - 匿名 block 转发 (&block) 在 Ruby 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76613899/