在控制器中找不到命名空间内的 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 助手不起作用,因为它使用“_path”的东西作为我认为的动作属性,所以它会抛出一个错误,它找不到方法“blog_entries_path”......有什么想法吗? 我开始认为 rails 不赞成模型和控制器的多个命名空间......这很遗憾,因为我真的很喜欢
// 路径结构。

以上是关于在控制器中找不到命名空间内的 Ruby on Rails 模型的主要内容,如果未能解决你的问题,请参考以下文章

创建 azurerm_data_protection_backup_vault 时,Terraform 返回错误“在命名空间中找不到资源类型”

C++ 在命名空间中找不到函数

在 Xamarin Studio 中找不到类型或命名空间名称“页面”

在命名空间/头文件中找不到类

链接器在命名空间中找不到函数定义

在 mapActions() 中找不到 vuex 模块命名空间:taskModule/?