rails控制台会话之间的持久常量

时间:2015-07-29 14:41:23

标签: ruby-on-rails-4

要重现这一点,您需要在全新的rails dir中使用两个文件:

# config/initializers/test.rb
load Rails.root.join 'lib', 'test.rb'

# lib/test.rb
module Test
  # BLA ||= "Oh nooooooooooooooo!"
  BLA ||= "Oh Yeeeeeeeeeeeeeeees!"
end

然后使用rails c启动rails控制台会话并键入Test::BLA

irb(main):001:0> Test::BLA
=> "Oh Yeeeeeeeeeeeeeeees!"

像这样编辑测试模块:

# lib/test.rb
module Test
  BLA ||= "Oh nooooooooooooooo!"
  # BLA ||= "Oh Yeeeeeeeeeeeeeeees!"
end

重启控制台:

irb(main):001:0> Test::BLA
=> "Oh Yeeeeeeeeeeeeeeees!"

这绝对令人讨厌。

摆脱旧状态并真正干净地重新启动rails控制台的唯一方法是关闭已运行rails c所有 shell会话。 - 是的,它具有传染性。

TF存储在哪个/如何存储状态?

2 个答案:

答案 0 :(得分:0)

这是Rails 4发生重大变化的结果,对于性能问题,Rails实例保持打开状态,因此您可以在第一次加载后非常快速地加载环境。

然而,常量应该是常量,在应用程序的任何实例中定义一次。您应该通过使用等于而不是等于或等于定义常量来解决此问题(与其他属性不同,它应始终具有文件中的值。)

# lib/test.rb
module Test
  BLA = "Oh crumbs!"
end

如果这是您要设置和重新设置的值,请​​尝试模块属性

# lib/test.rb
module Test
  mattr_accessor :bla
end

然后您可以使用double @设置它,就像类变量一样。

或者,如果您将模块包含在课程中,请改用cattr_accessor,使其成为该课程中的变量。

答案 1 :(得分:0)

后台运行了一些spring进程。一个可能带来丑陋副作用的根本解决方案是:

killall ruby && rails c

但更好的方法是在gem 'spring'中注释掉Gemfile行。