在控制器中找不到命名空间内的 Ruby on Rails 模型
Posted
技术标签:
【中文标题】在控制器中找不到命名空间内的 Ruby on Rails 模型【英文标题】:Ruby on Rails model inside namespace can't be found in controller 【发布时间】:2010-10-28 13:03:44 【问题描述】:我是 Rails 新手,无法弄清楚这个问题...
我有一个控制器
Admin::Blog::EntriesController
在 app/controllers/admin/blog/entries_controller.rb 中定义
我有一个模型叫
Blog::Entry
在 app/model/blog/entry.rb 中定义
当我尝试从控制器访问我的模型时,我从这一行得到一个"uninitialized constant Admin::Blog::EntriesController::Blog"
:
@blog_entries = Blog::Entry.find(:all)
显然它没有正确找到命名空间,这很奇怪,因为根据我所阅读的内容,我已使用正确的语法将模型放置在正确的文件夹中。
关于如何解决此问题的任何想法?
谢谢
【问题讨论】:
【参考方案1】:现在是 2011 年,我们处于 Rails 3.1 领域,但这个问题仍然存在。我刚刚使用引用非命名空间模型的命名空间控制器遇到了它,但只有当数据库中没有该模型的行时!
在型号名称前加上 :: 可以解决问题。
【讨论】:
在 Rails 4 中进行一些测试时遇到了这个问题。为模型创建一个空的 yml 固定装置修复了它,但根本问题实际上是具有与模型同名的命名空间 i>. 你能相信现在是 2018 年,同样的问题仍然存在。 :) 通过在模型前面加上 :: 来解决它。【参考方案2】:是的,从代码来看,form_for 在底层使用了 polymorphic_path。
【讨论】:
【参考方案3】:您可以通过使用实现自定义表名
set_table_name('foo')
在模型的顶部。
至于多个命名空间,你也许可以摆脱使用
polymorphic_path(@the_object)
生成您的网址,因为它会进行更基本的推理(至少根据我的经验,也许 form_for 会在后台使用它)。
【讨论】:
【参考方案4】:试试:
@blog_entries = ::Blog::Entry.find(:all)
它当前正在寻找错误的类。在Blog
之前使用::
将强制它从顶层查看。
【讨论】:
啊,谢谢,确实有效。但是,事实证明我还必须为我的模型设置一个自定义表名。此外,form_for 助手不起作用,因为它使用“以上是关于在控制器中找不到命名空间内的 Ruby on Rails 模型的主要内容,如果未能解决你的问题,请参考以下文章
创建 azurerm_data_protection_backup_vault 时,Terraform 返回错误“在命名空间中找不到资源类型”