匿名块转发(&block)在Ruby中是如何工作的?

jucafojl  于 2023-08-04  发布在  Ruby
关注(0)|答案(1)|浏览(103)

我使用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

nsc4cvqm

nsc4cvqm1#

根据https://api.rubyonrails.org/classes/Time.html#method-c-use_zone:
第一个月
允许Time.zone在提供的块内本地覆盖www.example.com;完成后将Time.zone重置为现有值。

# 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

字符串
所以时区的改变只在你传递给这个方法的块中可见。
看一看:

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

相关问题