【发布时间】:2011-12-31 16:09:59
【问题描述】:
Ruby 1.9.2 p290 和 Rails 3.0.9
我有一个结构如下的 .rb 文件:
module M1
# .... some method defs ...
# Code in the middle, outside of any def:
if Rails.version >= '3'
class Railtie < ::Rails::Railtie
ActiveSupport.on_load :action_controller do
ActionController::Base.send :include, ::M1::M2 # <- throws an error..
end
end
end
module M2
# ... method defs ...
end
end
ActionController::Base.send :include, ::M1::M2 行抛出 NameError - 它找不到 M2。
但是,当我将 M2 移动到 M1 的顶部时,它可以毫无问题地解析引用。这就是 Ruby 的工作方式吗?解释器没有第一次通过来获取范围内的所有有效名称?你能解释一下这种行为吗?
【问题讨论】:
-
定义您自己的从 ActionController::Base 继承的控制器后是否会出现该错误?
-
这段代码来自 open_id_authentication gem (github.com/Velir/open_id_authentication),尽管我更改了模块的名称以使其更易于阅读。每当我尝试运行服务器时都会发生错误(rails s)
-
从源代码中可以看出,代码将
on_load块定义为ActionController::Base.send :include, ControllerMethods,而不是ActionController::Base.send :include, ::OpenIdAuthentication::ControllerMethods。如果我错了,请纠正我 -
你是对的 - 我在本地代码中更改了它,因为源代码的东西也不起作用;同样的问题。打算在 github 上分叉它并提出拉取请求.. 不确定它对任何人的工作方式。
标签: ruby-on-rails ruby module mixins