我正在将旧的Rails应用程序迁移到Rails 3.2.11 / Ruby 1.9.3。
我们有一个ActiveRecord
模型ControlPoint
,它继承自另一个模型EventDependent
。加载ControlPoint
时,它调用EventDependent
方法设置table_name
,为此需要“事件ID”(每个事件都有自己的数据库)。
所有这一切的关键是,我们需要在模型加载时知道“事件ID”。
control_point_controller
有一个before_filter
来调用一个控制器方法来获取所需的“事件ID”(通过参数)。在以前版本的Rails中,这总是很好。
但是使用Rails 3.2.11它有时会工作......有时它不会!
当它不起作用时,问题是在我们准备好“事件ID”之前调用模型的“设置表名”。我试图用调试器调试它,但很多时候,流不会进入before_filter操作,因为它在此之前失败了。其他时候它进入...当它进入时,我们有可用的参数,一切正常。
我一直在搜索这个,但找不到任何相关的具体内容。我会说问题是模型和控制器的加载顺序不固定......并且它们同时开始加载,有时一个加载到另一个之前。这有意义吗?我认为大约70%的时间它不起作用,因为还没有定义“事件id”(因为它没有执行before_filter并且params还没有存在),而其他30%的时间它没有。< / p>
我的问题是:我可以以某种方式延迟模型的负载吗?或者在控制器的before_filter之后加载?对问题可能是什么的任何其他想法?
如果您愿意,我可以发布相关代码。
答案 0 :(得分:1)
我为此找到了解决方案,并希望与您分享,以防有人遇到类似问题,或者想要提出更好的建议。
正如我所说,问题是我无法控制何时在模型中执行“set_table_name”,因为此调用只是在模型中“浮动”,如下所示:
class ControlPoint < EventDependentModel
set_table_name 'ControlPoints'
....
....
end
因此,当在控制器的before_filter
之前调用它时(它发生了一些时间,随机...),“event_id”尚未可用。
我做的是从模型中移除对set_table_name
的调用,并在before_filter
中添加另一个control_point_controller
,如下所示:
class ControlPointsController < EventDependentController
before_filter :prepare_table_name
.....
.....
protected
def prepare_table_name
ControlPoint.set_table_name 'ControlPoints'
end
end
before_filter
中还有另一个EventDependentController
,它设置了我们需要的“event_id”(通过params)。这样,当set_table_name
执行时(在我的每个动作之前)控制器),“event_id”已由父控制器中的另一个before_filter设置。
问候!