【问题标题】:Local gem class is not found in Rails application在 Rails 应用程序中找不到本地 gem 类
【发布时间】:2014-07-04 10:10:23
【问题描述】:

我编写了一个生成器,它创建了以下 ruby​​ 文件和文件夹:

app/tests/test.rb

test.rb 文件中,我有一个Test 类,如下所示:

class Test < MyCustomModule::MyCustomClass::Base
...
end

现在,我想在 show.html.erb 文件之一中使用它的功能来创建这样的新实例:

Test.new(...).render(...).html_safe

但我收到以下错误:

uninitialized constant MyCustomModule::MyCustomClass::Base

我已使用以下 answer 链接我的 gem 和我的 rails 应用程序。它似乎可以使用生成器,但在 rails 应用程序中看不到 gem 模块和类。

谁能告诉我如何解决这个问题?


我已尝试按照 here 发布的提示进行操作,但仍然没有任何改变:

  1. application.rb文件中添加config.autoload_paths += Dir["#{config.root}/lib/**/"]
  2. 我已经创建了查看 CarrierWave gem 的 gem 结构,所以命名应该是正确的
  3. 我尝试禁用config.threadsafe!,但它已经被禁用,因为config.cache_classesconfig.eager_load 在开发中被设置为false

    弃用警告:config.threadsafe!已弃用。导轨 默认情况下,应用程序在生产中的行为是线程安全的,只要 config.cache_classes 和 config.eager_load 设置为 true。

另外,查看adding-asset-to-your-gems rails 文档,据说:

Rails 附带的 jquery-rails gem 就是一个很好的例子 作为标准的 JavaScript 库 gem。这个 gem 包含一个引擎 从 Rails::Engine 继承的类。通过这样做,Rails 是 告知此 gem 的目录可能包含资产和 该引擎的 app/assets、lib/assets 和 vendor/assets 目录 被添加到 Sprockets 的搜索路径中。

所以,我已经这样做了,并将我的模型类文件放在assets 文件夹中,但结果是一样的。


以下截图展示了我的真实案例:

  1. 下面的截图显示了我的gem文件结构

  2. 在这里你可以看到我是如何在我的 Rails 应用程序中加载 gem 的 Gemfile:

    gem 'thumbnail_hover_effect', '0.0.3', github: 'thumbnail_hover_effec/thumbnail_hover_effec', branch: 'master'
    
  3. 然后我使用 gem 生成器在 app/thumbnails/test.rb 文件夹中使用带有 cuttom 名称的 ruby​​ 文件,代码如下:

    class Test < ThumbnailHoverEffect::Image::Base
    ...
    end
    

    并尝试使用 Test 类给我 uninitialized constant ThumbnailHoverEffect::Image::Base 错误。

  4. 回到 gem 文件,thumbnail_hover_effect 文件的样子

    require 'thumbnail_hover_effect/version'
    require 'thumbnail_hover_effect/engine'
    require 'thumbnail_hover_effect/image'
    
    module ThumbnailHoverEffect
       # Your code goes here...
    end
    

    然后锄 image 文件看起来像:

     module ThumbnailHoverEffect
     #
        class Image
        ...
       end
     end
    

【问题讨论】:

  • 你能提供真实世界的代码吗?确切的类名是什么,文件名是什么?您确定所有内容都已正确加载吗(我对此表示怀疑)。
  • @phoet 抱歉,重播晚了。我添加了一些真实的代码,如果您需要了解其他内容,请告诉我。
  • ThumbnailHoverEffect::Image::Base 应该来自哪里?
  • MyCustomModule::MyCustomClass::Base的定义在哪里?
  • 我的意思是,如果您有错误提示 uninitialized constant ThumbnailHoverEffect::Image::Base,您应该显示 ThumbnailHoverEffect::Image::Base 的代码以及它是如何包含在您的代码库中的。

标签: ruby-on-rails ruby ruby-on-rails-4 gem ruby-2.0


【解决方案1】:

根据您在此处发布的内容,没有定义 ThumbnailHoverEffect::Image::Base。 Rails 自动加载约定(顺便说一句,您不应该依赖 gem,稍后会详细介绍)将在 thumbnail_hover_effect/image/base.rb 中查找此文件,但您打印的目录结构没有。当然,您可以在thumbnail_hover_effect/image.rb 中定义该类,它会起作用,但您发布的精简版 sn-p 并未显示这一点。那么ThumbnailHoverEffect::Image::Base是在哪里定义的呢?

如果它在thumbnail_hover_effect/image/base.rb 中,则表明该文件没有被加载。您可以通过在thumbnail_hover_effect/image/base.rb 的顶部放置puts 'loading this stupid file' 来进行完整性检查。这将允许您通过查看您的类定义是否存在问题,或者问题是否与加载正确的文件有关,从而将问题一分为二。调试就是将问题一分为二。

【讨论】:

  • 它甚至不像有ThumbnailHoverEffect::Image::Base
  • 当然没有ThumbnailHoverEffect::Image::Base - 我根本没有定义这样的类。我以这种愚蠢的情况告终,因为我是一个 ruby​​ 新手,决定使用一个有效的 gem 结构和代码作为模板。
猜你喜欢
  • 1970-01-01
  • 2012-02-10
  • 2016-09-23
  • 1970-01-01
  • 2017-08-31
  • 2021-10-28
  • 2019-10-25
  • 1970-01-01
  • 2012-03-29
相关资源
最近更新 更多