我可以在离开范围时触发清理吗?

时间:2015-02-25 03:42:36

标签: ruby

有时我发现自己需要将上下文附加到特定范围,一旦范围退出就释放它,例如。

User.all do |u|
  custom_logger.with_context({ user_id: u.id }) do
    # .. some code
    custom_logger.warn('something happened')
    # .. some more code
  end
end

你会在rails中看到这种模式,例如

I18n.with_locale(...) do
  # some code
end

我想要一个类似的行为,但是一旦我退出当前范围,就会发生清理,例如

User.all do |u|
  custom_logger.set_scoped_context({ user_id: u.id })
  # .. some code
  custom_logger.warn('something happened')
  # .. some more code
end 

在上面的代码中,我希望行为与前面的示例类似,但是上下文的作用域是周围的范围。

红宝石可以达到这个目的吗?

1 个答案:

答案 0 :(得分:0)

改变全局状态并期望一些隐藏的抽象来清理/重置状态非常容易出错。如果您不喜欢块样式,我建议使用当前上下文创建一个新的记录器,而不是更改全局状态:

User.all do |u|
  scoped_logger = custom_logger.with_context({ user_id: u.id })
  # .. some code
  scoped_logger.warn('something happened')
  # .. some more code
end