ruby-on-rails - rails 3.2.11 : Weird behaviour because of loading order of Controller and model

标签 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 来调用 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/

相关文章:

ruby-on-rails - Prawn :带页码的目录

ruby-on-rails - RSpec 的未定义方法 `its'(Hartl 的 Ruby on Rails 教程)

ruby-on-rails - 尽管 expires_in 24.hours,Rails 缓存值丢失/为零

ruby-on-rails-3.2 - 我可以使用 Guard/Spork 更改每次在 Rspec 中运行的随机化种子吗?

ruby-on-rails - 验证 rails 3.2 中的 has_many 关系

ruby-on-rails - Ruby/Rails - 运行部署后任务的更好方法?

ruby-on-rails - Rails 使用正确的 URL 渲染命名路由

ruby-on-rails - Rails 设计多态 - 使用 Ajax 获取部分渲染

ruby-on-rails - 有什么好的方法可以暂时阻止 ActiveRecord 执行查询吗?

css - 在 Lynda.com Rails 教程中获取错误 "ExecJS::ProgramError in Subjects#index"