Где правильное место для инициализации ограничения BigDecimal при использовании Puma - PullRequest
5 голосов
/ 27 мая 2020

У меня есть инициализатор рельсов, который устанавливает ограничение на Big Decimal

BigDecimal.limit(20)

Это выполняется и, кажется, правильно устанавливает ограничение.

Но когда приходит веб-запрос (я использую Puma), кажется, что ограничение не установлено для потока, который обрабатывает запрос. Предел установлен на 0, что является значением по умолчанию.

Где еще я должен установить лимит?

Если вы хотите воспроизвести:

создайте новый rails app и добавьте инициализатор, который устанавливает ограничение

BigDecimal.limit(20)
puts "*** Set #{BigDecimal.limit}"

в вашем контроллере приложения, добавьте

before_action :check_big_decimal

def check_big_decimal
  puts "***request #{BigDecimal.limit}"
end

запустите свой сервер, обновите страницу sh и сделайте запрос

Вы должны увидеть, что оно установлено на 20, но затем оно вернется к 0, когда поступит запрос.

Ответы [ 2 ]

4 голосов
/ 03 июня 2020

Я получил ответ от сообщества Rails

Basi c суть:

Это происходит потому, что Ruby хранит ограничение BigDecimal в локальное хранилище потоков. Когда, например, Puma запускает новый поток для обработки запроса, новый поток не может получить доступ к ограничению BigDecimal, установленному в исходном потоке.

0 голосов
/ 29 мая 2020

Хакерский и не рекомендуемый способ - исправить класс обезьяной. Вы можете добавить это в инициализатор

class BigDecimal
  def self.limit(val = 25)
    25
  end
end

Вопрос в том, действительно ли вы действительно хотите ограничить 25 везде? если да, то вы можете попробовать это как ПОСЛЕДНИЙ КУРС, потому что я не уверен в побочных эффектах жесткого кодирования этого значения (и вообще переопределения этого метода)

...