在Rails应用程序中找不到本地gem类

时间:2014-05-15 19:32:11

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

我写了一个生成器,它创建了以下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. config.autoload_paths += Dir["#{config.root}/lib/**/"]档案中添加application.rb
  2. 我创建了我的宝石结构,看着CarrierWave gem,所以命名应该是正确的
  3. 我尝试停用config.threadsafe!但已被停用,因为config.cache_classesconfig.eager_load在开发中设置为false

      

    弃权警告:config.threadsafe!已弃用。轨道   默认情况下,应用程序在生产中表现为线程安全   config.cache_classes和config.eager_load设置为true。

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

      

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

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


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

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

      enter image description here

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

      gem 'thumbnail_hover_effect', '0.0.3', github: 'thumbnail_hover_effec/thumbnail_hover_effec', branch: 'master'
      
    3. 然后我使用gem生成器在app/thumbnails/test.rb文件夹中使用带有cutstom名称的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
      

1 个答案:

答案 0 :(得分:1)

根据您在此处发布的内容,未定义ThumbnailHoverEffect::Image::Base。 Rails自动加载约定(你不应该依赖于gem btw,稍后会有更多内容)将在thumbnail_hover_effect/image/base.rb中查找此文件,但是您打印的目录结构没有。当然,您可以在thumbnail_hover_effect/image.rb中定义该类,但它可以正常工作,但您发布的精简片段并未显示。那么ThumbnailHoverEffect::Image::Base定义在哪里?

如果它在thumbnail_hover_effect/image/base.rb中,则表示文件未加载。您可以通过puts 'loading this stupid file'位于thumbnail_hover_effect/image/base.rb的顶部来检查这一点。这将允许您通过查看您的类的定义是否存在问题,或者问题是否与加载正确的文件一起来平分问题。调试就是将问题分成两部分。