Rails 3初始化程序仅在`rails server`上运行而不是`rails generate`等

时间:2011-12-28 18:54:07

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

我有一小段初始化程序代码,我想在rails server运行时运行,但不是在运行rails generaterails console或任何其他rails命令(包括rake任务)时运行这需要环境任务)。这段代码预先填充了一些缓存并且相对昂贵,所以我真的不希望它运行在除rails s

之外的任何内容上

不满意的解决方案:

Foreman等人。将意味着它将运行在一个不同的进程上,这个进程是(a)代表那一小段代码的顶部,(b)需要进程间通信而不是初始化程序提供的简单内存中方法。

在服务器上我通过配置乘客将一个特殊的环境变量传递给rails来解决这个问题,告诉它它在服务器上下文中运行。但是,如果可能的话,我希望在所有开发人员的机器上开箱即用,而不需要记住以一种同样提供该环境变量的方式运行rails服务器(即IN_SERVER=true rails server)。

rails server而不是rake中运行初始化程序时,始终会询问此问题。但是我希望它只在服务器初始化时运行 - rake的修复很好但不全面。

2 个答案:

答案 0 :(得分:4)

您可以执行覆盖Rails::Server#initialize之类的操作,以便在初始化程序中调用初始化代码吗?

或者,更简单地说,只需将代码放在script/rails中,因为每次运行rails server时都会运行代码,您可以轻松地使用ARGVENV那里。

答案 1 :(得分:0)

这是一种方式:

# config/initializers/my_init.rb
Rails.application.config.after_initialize do
    # tweak this as required...
    unless defined?(::Rails::Generators) || defined?(::Rails::Console) || File.basename($0) =='rake'
        Rails.logger.info("Doing some init")
        # ...
    end
end