ruby-on-rails - 匿名 block 转发 (&block) 在 Ruby 中如何工作?

标签 ruby-on-rails ruby timezone

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

相关文章:

C#英国夏令时(BST)时区缩写

ruby-on-rails - => 运算符与 = 运算符

ruby-on-rails - Rails paper_trail 与 Active Storage 导致重复版本

ruby-on-rails - Rails 中的日期时间比较失败

ruby - 删除数组中的值在 Ruby 中反向遍历它

python - 如何扩展 Python 识别的时区列表?

java - 如何在 Java 中转换 UTC 和本地时区

ruby-on-rails - 来自助手的条件文本

ruby-on-rails - rails 4 : Layout file outside 'views/layouts' folder

ruby-on-rails - 使用正则表达式从文件中提取环境变量