当启动Rails控制台时如何自动运行代码?

8

假设我想在每次打开Rails控制台时得到一个问候:

Scotts-MBP-4:ucode scott$ rails c
Loading development environment (Rails 4.2.1)
Hello there! I'm a custom greeting
2.1.5 :001 >

我应该把puts 'Hello there! I\'m a custom greeting'语句放在哪里?

另一个Stackoverflow的回答建议我可以把它放在初始化程序中,像这样:

# config/initializers/console_greeting.rb
if defined?(Rails::Console)
  puts 'Hello there! I\'m a custom greeting'
end

不过,对我来说这个方法并不奏效 :(. 即使没有 if defined?(Rails::Console) 也没有输出。似乎当我进入控制台时,初始化程序并未运行,尽管其他人有所建议。


我通常会将它们放在您指定的位置,而不使用if defined?(Rails::Console),并且从未遇到过任何问题... 我想这里是否还有其他因素在起作用呢? - Brad Werth
当我使用 rails s 运行服务器时,“Hello there....” 行确实会被显示出来。所以初始化程序正在执行。只有在启动整个服务器时才会执行,而不是在启动控制台时执行。 - at.
bwerth@worth:~/rails/my_site$ bundle exec rails c“Devise猴子补丁适用于v 3.4.1。在继续之前请检查”正在加载开发环境(Rails 4.0.2) - Brad Werth
值得一提的是,p ('Devise monkey patch for v 3.4.1. Check before moving on')config/initializers/devise_minkey_patch.rb 中的第一行...你还使用了哪些宝石?有任何记录器方面的问题吗? - Brad Werth
2个回答

5
以下内容适用于 Rails 6
只需将块传递给 Rails.application.console,例如:
    # config/initializers/custom_console_message.rb
    if Rails.env.production?
      Rails.application.console do
        puts "Custom message here"
      end
    end

现在当启动 Rails 生产环境控制台时,将打印自定义消息。当你启动 Rails 服务器时,此代码不会被执行。

如果你想要在所有环境中运行此代码,请移除 if Rails.env.production?


谢谢你的回答。你知道是否有一个文件位置 - 类似于/tests文件夹 - 可以确保不会在生产数据库中加载吗?我注意到你有一个条件Rails.env.production?,但我想知道是否有其他处理方式? - undefined
1
不是文件位置,不是。我仍然认为这是一个相当干净的解决方案 - 为了避免在生产环境中使用,你可以将其切换为 unless Rails.env.production? 或其他方式。 - undefined

4

我使用~/.irbrc来实现类似的目的(我在每个控制台会话中都需要一个gem)。例如,我的.irbrc文件:

if (defined? Rails)
  # Rails specific
end

# common for all irb sessions

你可以使用项目名称来限制执行代码只在一个项目的控制台中运行:
if (defined? Rails) && (defined? YourProject)
  # code goes here
end

这个能在Heroku上运行吗? - at.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接