1

Hyperstack是一个同构框架,相同的代码可以在服务器端或客户端运行。因此,在某些特定情况下,根据执行某些代码的位置(服务器或客户端),应该完成不同的事情(客户端同步等)。

问题是依赖默认检查是否

defined?(Rails::Server) 

取决于您正在运行的网络服务器和封闭环境。

例如,我在 puma 上运行(在 docker 中进行开发,在 Ubuntu 服务器中进行生产),即使在这种情况下定义?(Rails::Server)在开发中运行良好,但在生产中运行不正常。这表明服务器执行检测不仅取决于您正在运行的实际服务器,还取决于用于启动它的方法(例如 rails s VS puma start)

可以在此处找到其他信息:

  1. 检测应用程序是否作为 HTTP 服务器启动(rake 任务、rconsole 等)

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

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

是否有一种标准方法可以检查 Rails 中的某些内容是否在服务器进程/线程上执行(而不是在浏览器、某种客户端、控制台、迁移、rake 任务等),而不依赖于一些黑客来识别或声明我们的服务器部署在(puma、thin、nginx 等)上?

4

1 回答 1

0

您可以使用 RUBY_ENGINE 守卫来查看代码是否在 Opal 中运行。

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

这在您的同构模型中非常有用,可以将模型的部分方法从客户端上的现有中排除。对于使用在客户端代码中没有意义的添加的 Gem 方法也非常有用。

于 2019-05-16T04:02:52.887 回答