Каков наиболее точный способ проверить, находитесь ли вы в процессе сервера rails для нужд Hyperstack

Hyperstack — это изоморфная структура, в которой один и тот же код может выполняться на стороне сервера или клиента. Таким образом, есть определенные случаи, когда в зависимости от того, где выполняется некоторый фрагмент кода (на стороне сервера или на стороне клиента), должны выполняться разные вещи (синхронизация клиента и т. д.).

Проблема в том, что, полагаясь на проверку по умолчанию, если

defined?(Rails::Server) 

зависит от используемого вами веб-сервера и окружающей среды.

Например, я работаю на puma (в докере для разработки и на сервере Ubuntu для производства), и даже в этом случае определено? (Rails::Server) отлично работает в разработке, но не в производстве. Это показывает, что обнаружение выполнения сервера зависит не только от фактического сервера, на котором вы работаете, но и от метода, используемого для его запуска (например, запуск rails s VS puma)

Дополнительную информацию можно найти здесь:

  1. Определить, запущено ли приложение как HTTP-сервер или нет (rake task, rconsole и т. д.)

  2. https://gitter.im/ruby-hyperloop/chat?at=59d60f2201110b72317cd61c

  3. https://hyperstack-org.slack.com/archives/CHRQ5U8HL/p1557262851049900

Существует ли стандартный способ проверить, выполняется ли что-то в Rails в процессе/потоке сервера (не в браузере, в каком-то клиенте, консоли, миграции, задаче rake и т. д.), не полагаясь на какой-либо хак, чтобы определить или объявить, какой сервер мы развернуть на (puma, thin, nginx и т. д.)?


person Michail    schedule 08.05.2019    source источник


Ответы (1)


Вы можете использовать защиту RUBY_ENGINE, чтобы увидеть, работает ли код в Opal или нет.

if RUBY_ENGINE == 'opal'
    # I am on the client
end

Это очень полезно в ваших изоморфных моделях, чтобы исключить части методов модели из существующих на клиенте. Также очень полезно использовать добавленные методы Gem, которые не имеют смысла в клиентском коде.

person BarrieH    schedule 16.05.2019
comment
Это способ проверить, находитесь ли вы в контексте опала. Я прошу способ отличить консольное выполнение от выполнения на сервере. Проблема в том, что определение константы Rails::Server зависит от того, как вы запускаете процесс веб-сервера (например, в случае puma), так что вы можете решить, нужно ли вам транслировать сообщения на подключенные каналы... - person Michail; 16.05.2019