我正在将旧的 Rails 应用程序迁移到 Rails 3.2.11/Ruby 1.9.3。
我们有一个 ActiveRecord
模型 ControlPoint
继承自另一个模型 EventDependent
。当 ControlPoint
被加载时,它调用 EventDependent
的方法来设置 table_name
,为此它需要一个“事件 ID”(每个事件有自己的数据库)。
所有这一切的关键是我们需要在加载模型时知道“事件 ID”。
control_point_controller
有一个 before_filter
来调用 Controller 方法来获取所需的“事件 ID”(通过参数)。在以前的 Rails 版本中,这总是能正常工作。
但是对于 Rails 3.2.11,它有时可以工作...有时却不能!
当它不起作用时,问题是在我们准备好“事件 ID”之前调用了模型的“设置表名”。我曾尝试使用调试器对其进行调试,但很多时候,流程不会进入 before_filter 操作,因为它在此之前失败了。其他时候它进入...当它进入时,我们有可用的参数,一切正常。
我一直在搜索这个,但找不到任何相关的具体内容。我会说问题是模型和 Controller 的加载顺序不固定......它们同时开始加载,有时一个先于另一个加载。这有意义吗?我认为大约 70% 的时间它不起作用,因为还没有定义“事件 ID”(因为它没有执行 before_filter 并且参数还不存在),而另外 30% 的时间它起作用。
我的问题是:我能否以某种方式延迟模型的加载?或者让它在 Controller 的 before_filter 之后加载?关于问题可能是什么的任何其他想法?
如果你愿意,我可以发布相关代码。
最佳答案
我找到了一个解决方案并想与您分享,以防有人遇到类似问题,或者想提出更好的想法。
正如我所说,问题在于我无法控制“set_table_name”何时在模型中执行,因为此调用只是“ float ”在模型中,如下所示:
class ControlPoint < EventDependentModel
set_table_name 'ControlPoints'
....
....
end
所以当它在 Controller 的 before_filter
之前被调用时(它随机发生了几次......),“event_id”还不可用。
我所做的是从模型中删除对 set_table_name
的调用,并在 control_point_controller
中添加另一个 before_filter
,如下所示:
class ControlPointsController < EventDependentController
before_filter :prepare_table_name
.....
.....
protected
def prepare_table_name
ControlPoint.set_table_name 'ControlPoints'
end
end
EventDependentController
中还有一个before_filter
,它设置了我们需要的“event_id”(通过params)。这样,当set_table_name
将被执行(在我的 Controller 中的每个 Action 之前),“event_id”已经被父 Controller 中的另一个 before_filter 设置。
问候!
关于ruby-on-rails - rails 3.2.11 : Weird behaviour because of loading order of Controller and model,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14591713/