2

我正在将旧的 Rails 应用程序迁移到 Rails 3.2.11/Ruby 1.9.3。

我们有一个继承自另一个模型ActiveRecord的模型。加载时,它调用一个方法来设置,为此它需要一个“事件 id”(每个事件都有自己的数据库)。ControlPointEventDependentControlPointEventDependenttable_name

这一切的关键是,我们需要在模型加载时知道“事件 id”。

control_point_controller一个before_filter调用控制器方法来获取所需的“事件ID”(通过参数)。在以前的 Rails 版本中,这始终可以正常工作。

但是在 Rails 3.2.11 中,它有时可以工作……有时却不行!

当它不起作用时,问题是模型的“设置表名”在我们准备好“事件 id”之前被调用。我曾尝试使用调试器对其进行调试,但很多时候,流程不会进入 before_filter 操作,因为在此之前它会失败。其他时候它进入......当它进入时,我们有可用的参数,并且一切正常。

我一直在搜索这个,但找不到任何相关的具体内容。我会说问题在于模型和控制器的加载顺序不固定......它们同时开始加载,有时一个在另一个之前加载。这有意义吗?我认为大约 70% 的时间它不起作用,因为还没有定义“事件 id”(因为它没有执行 before_filter 并且 params 还不存在),而另外 30% 的时间它确实如此。

我的问题是:我可以以某种方式延迟模型的加载吗?或者让它在控制器的 before_filter 之后加载?关于问题可能是什么的任何其他想法?

如果您愿意,我可以发布相关代码。

4

1 回答 1

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_filterin EventDependentController,它设置了我们需要的“event_id”(通过参数)。这样,何时set_table_name执行(在我的控制器中的每个操作之前),“event_id”已经由父级中的另一个 before_filter 设置控制器。

问候 !

于 2013-01-30T10:31:51.227 回答