使用 Puma 时初始化 BigDecimal 限制的正确位置在哪里
Where is the correct place to initialize BigDecimal limit when using Puma
我有一个 rails 初始化程序,它设置了大十进制数的限制
BigDecimal.limit(20)
这已执行并且似乎正确设置了限制。
但是当网络请求进来时(我使用的是 Puma),处理请求的线程似乎没有设置限制。限制设置为默认值 0。
我应该在其他地方设置限制吗?
如果要复现:
创建一个全新的 rails 应用程序并添加一个设置限制的初始化程序
BigDecimal.limit(20)
puts "*** Set #{BigDecimal.limit}"
在您的应用程序控制器中添加
before_action :check_big_decimal
def check_big_decimal
puts "***request #{BigDecimal.limit}"
end
启动您的服务器,刷新页面并发出请求
您应该会看到它设置为 20,但当收到请求时它又回到 0。
一种不推荐的方法是猴子修补 class。您可以在初始化程序中添加它
class BigDecimal
def self.limit(val = 25)
25
end
end
问题是,你真的真的想在所有地方都限制为 25 个吗?如果是,那么您可以尝试将此作为最后的手段,因为我不确定对该值进行硬编码(并完全覆盖该方法)的副作用
我从 Rails community
那里得到了答案
基本要点是:
发生这种情况是因为 Ruby 将 BigDecimal 限制存储在线程本地存储中。
当例如Puma 开启新线程处理请求,新线程无法访问初始线程中设置的BigDecimal限制。
我有一个 rails 初始化程序,它设置了大十进制数的限制
BigDecimal.limit(20)
这已执行并且似乎正确设置了限制。
但是当网络请求进来时(我使用的是 Puma),处理请求的线程似乎没有设置限制。限制设置为默认值 0。
我应该在其他地方设置限制吗?
如果要复现:
创建一个全新的 rails 应用程序并添加一个设置限制的初始化程序
BigDecimal.limit(20)
puts "*** Set #{BigDecimal.limit}"
在您的应用程序控制器中添加
before_action :check_big_decimal
def check_big_decimal
puts "***request #{BigDecimal.limit}"
end
启动您的服务器,刷新页面并发出请求
您应该会看到它设置为 20,但当收到请求时它又回到 0。
一种不推荐的方法是猴子修补 class。您可以在初始化程序中添加它
class BigDecimal
def self.limit(val = 25)
25
end
end
问题是,你真的真的想在所有地方都限制为 25 个吗?如果是,那么您可以尝试将此作为最后的手段,因为我不确定对该值进行硬编码(并完全覆盖该方法)的副作用
我从 Rails community
那里得到了答案基本要点是:
发生这种情况是因为 Ruby 将 BigDecimal 限制存储在线程本地存储中。 当例如Puma 开启新线程处理请求,新线程无法访问初始线程中设置的BigDecimal限制。