【问题标题】:How to run my ruby code after Rails server start?Rails 服务器启动后如何运行我的 ruby​​ 代码?
【发布时间】:2011-12-17 09:45:02
【问题描述】:

我试过了:

after_initialize do
  #code
end

但是:(文档)

您的应用程序的某些部分,特别是观察者和路由,不是 尚未在调用 after_initialize 块的位置设置。

我的代码中需要路由和记录器

有什么想法吗?

【问题讨论】:

  • 您能否更明确地说明您的问题。
  • 我想要 on_server_start 事件。
  • 你为什么想要那个?你想让我做什么?解释您的问题,也许有比“on_server_start”事件更好的解决方案。
  • @MaurícioLinhares 下面是一个例子:我想要一个 STOMP 订阅者,它会在服务器启动后启动,而不是在控制台运行时启动。

标签: ruby-on-rails ruby ruby-on-rails-3


【解决方案1】:

请参阅http://guides.rubyonrails.org/configuring.html 的第 3.1 节

我相信你会把这段代码放在 config/application.rb 中

config.after_initialize do
    # ....
end

# config.after_initialize takes a block which will be run after Rails has finished initializing the application. 
# That includes the initialization of the framework itself

还有http://guides.rubyonrails.org/initialization.html

【讨论】:

  • 这也会在调用 Rails 控制台 (rails c) 时运行。
  • ...以及依赖于 Rails 的 rake 任务。是否有可靠的机制在服务器启动时收到通知?!
【解决方案2】:

@house9's answer 是正确的,正如 cmets 所指出的,这也会在运行 rake 任务、控制台等时执行。我使用以下内容来识别服务器何时实际执行:

# application.rb
if defined?(Rails::Server)
  config.after_initialize do
    # Do stuff here
  end
end

【讨论】:

  • 这仅在以rails server 开头时才有效,如果直接以 puma 开头,则不会...(并且始终定义 Puma::Server)
  • 还验证了这不适用于Passenger(很可能不是生产中的任何服务器)。
【解决方案3】:

另一种选择是创建自定义初始化程序。它只是一个位于 config/initializers/ 下的 ruby​​ 文件,并且完全执行“on_server_start”事件:)

【讨论】:

  • 与@house9 的响应一样,它在rails 控制台中运行并执行加载rails 环境负载的任务。
【解决方案4】:

添加到config.ru 的行将由 Rails 服务器运行,但不会由 Rails 控制台或加载环境的 Rake 任务运行。

# config.ru
# This file is used by Rack-based servers to start the application.

require ::File.expand_path("../config/environment", __FILE__)
# your code here (after environment is loaded)
run Rails.application

【讨论】:

    【解决方案5】:

    由于 Rails 5 默认服务器是 Puma,所以 config/puma.rb 中的代码将只运行一次,并且仅在服务器启动时运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-02
      • 1970-01-01
      • 2017-04-11
      • 1970-01-01
      • 2017-01-23
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      相关资源
      最近更新 更多