加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Rails如何找到模型和控制器?如何让它加载更多

发布时间:2020-12-17 01:54:03 所属栏目:百科 来源:网络整理
导读:我正在尝试在app / models / gamestate.rb中创建一个非ActiveRecord模型.然后在我的控制器(PlayController)内我应该可以做GameState.new,对吗?不去: NameError (uninitialized constant PlayController::GameState): app/controllers/play_controller.rb:2
我正在尝试在app / models / gamestate.rb中创建一个非ActiveRecord模型.然后在我的控制器(PlayController)内我应该可以做GameState.new,对吗?不去:

NameError (uninitialized constant PlayController::GameState):
  app/controllers/play_controller.rb:23:in `play'

(至少在开发环境中)

但!如果我有一个名为app / models / play.rb的模型,那么它会自动加载,我可以做Play.new.

所以我的问题是:Rails如何知道要加载哪些类?从Play#action到PlayController到app / controllers / play_controller.rb到app / models / play.rb,它会做什么样的名称修改?

它似乎非常脆弱,但也许更好地了解它的工作原理会有所帮助.

最后,我怎样才能加载app / models / gamestate.rb?

解决方法

为了扩展Ryan的答案,这是一个Rails惯例.在Rails 3中,activesupport / lib / dependencies.rb有一个名为load_missing_constant的方法,当你引用GameState并且尚未加载时,它会查找GameState.它需要丢失常量’GameState’,在其上调用’下划线’将其转换为game_state,然后在autoload_paths中搜索它.如果它找到具有该名称的文件(以.rb结尾),则会加载它.

在生产模式中,game_state.rb将被预先加载(假设它在一个autoload_paths中),因此GameState类常量将在您引用它时加载.在这种情况下不需要修剪.

您可能希望将非AR模型放在单独的文件夹中;例如,您可以添加到config / application.rb中的自动加载路径,例如:

config.autoload_paths += %W(#{config.root}/lib)

然后你可以把类GameState放在lib / game_state.rb中,Rails会找到它.

顺便说一句,我不是Rails专家,但是解决这个问题的一种方法是运行Ruby调试器并设置断点,其中“魔术”似乎发生;然后你可以使用where或caller(0)来回溯并找到相关的Rails代码.有时需要花几次尝试使用策略断点(或者通过在源代码中添加调试器),但是一旦看到它逐行发生,通常就会有意义.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读