0

我正在控制器中处理许多类。我把它们放在不同的文件中。由于我仍然没有找到包含它们的正确方法(在不重新启动 Rails 服务器的情况下获取我的更改),我在我的控制器 rb 文件之上使用它:(我在堆栈上找到的这个建议)

if Rails.env.development?
    load 'classes.rb'
else
    require 'classes'
end 

class FunController < ApplicationController
...

这很好,尽管我仍在寻找正确的解决方案。

但(!)

我在 classes.rb 中放了(不是那么简单的)代码

class FunClass
 def initialize
  sayHello
  sayHello
 end

 def sayHello
  puts "hello"
 end
end

并且——当然!- 我得到了我的两个你好

但我不喜欢“你好”,我用“嗨”,我不得不改变它,并犯了一个错误:代码现在看起来:

class FunClass
 def initialize
  sayHi
  sayHello # <-- this one I have overseen
 end

 def sayHi
  puts "Hi"
 end
end

如果你喜欢谜语,猜猜我得到了什么!

不,不是错误

我得到一个“嗨”和一个“你好”

虽然我是 ruby​​-on-rails 的新手,但我很清楚这里会发生什么,但这不是一个错误而不是一个功能吗?重新启动 Rails 服务器,您会收到预期的错误。

irl 我不小心在函数名称中间放了一个“s”(没有 ctrl 的 ctrl-s),并搜索了几个小时为什么没有弹出这个函数的更改。

我完全错了还是这是一个错误?

4

1 回答 1

1

不要使用requireor load:这会破坏 rails 的代码重载系统。只要 FunClass 在 fun_class.rb 中(通常文件名应该是类名的下划线版本),在 rails 自动加载路径的某个地方,它就会在引用时自动加载,并在请求之间重新加载。默认情况下,lib 不会在请求之间重新加载。

您给出的示例是因为当您load第二次调用时,它会重新打开现有的类。虽然这允许重新定义或添加方法,但它不会删除新版本文件中没有的任何方法。这就是loadruby​​ 的工作原理——而不是 rails 的事情。

于 2013-07-25T18:47:23.237 回答