Rails 3.2.11:由于Controller和模型的加载顺序而导致奇怪的行为

时间:2013-01-29 20:33:43

标签: ruby-on-rails ruby ruby-on-rails-3.2

我正在将旧的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之后加载?对问题可能是什么的任何其他想法?

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

1 个答案:

答案 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设置。

问候!