【问题标题】:Rails model name lookup: strange uninitialized constant errorRails 模型名称查找:奇怪的未初始化常量错误
【发布时间】:2019-06-16 18:26:12
【问题描述】:

我有一个控制器应该输出表单的建议。控制器位于 Admin::Shop 命名空间下,位于 app/controllers/admin/shop/suggest_controller.rb

class Admin::Shop::SuggestController < Admin::AdminsAreaController
  def index
    render:json => Shop::Product.all.group(:name).pluck(:name) and return
  end
end

Shop::Product 是在 app/models/shop/product.rb 下定义的模型如下:

class Shop::Product < PostgresRecord
  # ...
end

我可以从控制台和 rspec 测试对此模型运行查询,而不会出现任何问题。但是当我尝试从控制器内部查询时,如果文件更改(我编辑并保存)我会得到uninitialized constant Admin::Shop::SuggestController::Shop

要让它再次工作,我必须重新启动服务器(使用 Puma)。

尝试从其他命名空间中的其他控制器查询时,我得到了相同的行为。

日志中没有任何相关内容。

我做错了什么?

【问题讨论】:

  • 试试::Shop::Product.all.group。这将导致在全局命名空间中开始持续查找。
  • 你太棒了,它有效。但为什么它不能像“默认”那样工作呢?
  • 可能与顶级常量查找有关,在ruby 2.5 中已更改。你在哪个版本?我的猜测是它在Admin::Shop 找到了Shop 的匹配项,并且不知道如何回溯,如果找不到Admin::Shop::Product,所以它只是保释并抱怨它没有找到你的常量寻找。
  • 我在 2.5.5 上,所以我想就是这样。有没有办法为这个特定的命名空间设置从顶部开始的常量查找?所以我可以避免用 :: 作为前缀,因为我在这里有 20 个模型。
  • @AndrewSchwartz - 出于好奇,是什么让您认为这是一个 ruby​​ 而不是 rails 问题?

标签: ruby-on-rails


【解决方案1】:

试试::Shop::Product.all.group。这将导致在全局命名空间中开始持续查找。

关于这个主题有很多很好的articles。给他们读一读!

【讨论】:

    猜你喜欢
    • 2015-05-03
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多