我写了一个生成器,它创建了以下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发布的提示,但仍然没有改变:
config.autoload_paths += Dir["#{config.root}/lib/**/"]
档案中添加application.rb
CarrierWave
gem,所以命名应该是正确的我尝试停用config.threadsafe!
但已被停用,因为config.cache_classes
和config.eager_load
在开发中设置为false
弃权警告:config.threadsafe!已弃用。轨道 默认情况下,应用程序在生产中表现为线程安全 config.cache_classes和config.eager_load设置为true。
另外,查看adding-asset-to-your-gems rails文档,据说:
这方面的一个很好的例子是Rails附带的jquery-rails gem 作为标准的JavaScript库gem。这个宝石包含一个引擎 继承自Rails :: Engine的类。通过这样做,Rails是 告知此gem的目录可能包含资产和 此引擎的app / assets,lib / assets和vendor / assets目录 被添加到Sprockets的搜索路径中。
所以,我已经完成了这个,并将我的模型类文件放在assets
文件夹中,但结果是一样的。
以下屏幕截图展示了我的真实案例:
下面的屏幕截图显示了我的gem文件结构
在这里,您可以看到我如何在我的Rails应用程序Gemfile
中加载gem:
gem 'thumbnail_hover_effect', '0.0.3', github: 'thumbnail_hover_effec/thumbnail_hover_effec', branch: 'master'
然后我使用gem生成器在app/thumbnails/test.rb
文件夹中使用带有cutstom名称的ruby文件,代码如下:
class Test < ThumbnailHoverEffect::Image::Base
...
end
并且尝试使用Test
类会给我uninitialized constant ThumbnailHoverEffect::Image::Base
错误。
回到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
答案 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
的顶部来检查这一点。这将允许您通过查看您的类的定义是否存在问题,或者问题是否与加载正确的文件一起来平分问题。调试就是将问题分成两部分。