我正在尝试在我的Rails应用程序中加载模块但是我收到以下错误:
预期/Users/ha/Projects/MyProject/app/services/user.rb来定义用户
我有这个文件夹结构
/app
/controllers
users_controller.rb
/models
...
/services
web_services.rb
user.rb
web_services.rb:
module WebServices
include HTTParty
def test
Rails.logger.debug 'webservices works!!!'
end
end
user.rb:
module WebServices
class User
def test_user
Rails.logger.debug 'user works'
end
end
end
当我尝试在user_controller.rb中实例化用户时出现错误:
class UsersController < ApplicationController
include WebServices
def index
user = WebServices::User.new
user.test_user
end
end
我尝试在application.rb中添加以下代码但没有工作
config.autoload_paths += %W(#{config.root}/app/services)
config.autoload_paths += Dir["#{config.root}/app/services/**/"]
我尝试了以下代码,但也没有用(environment.rb):
Dir['../app/services/*'].each do |file|
require file
end
Rails 3.2.11 和 Ruby 1.9.3p194
有人帮助我吗?
答案 0 :(得分:1)
错误消息说明,加载程序能够查找并尝试加载user.rb
。因此,使用config.autoload_paths
无法解决问题。
当有人定义了一个意外映射到现有文件名的模型时,通常会发生此错误。尝试将User
重命名为非常不同:
~ cat …/myuser.rb
class MyUser
def test_user
Rails.logger.debug 'user works'
end
end
这应该让它发挥作用。
答案 1 :(得分:1)
这是因为Rails尝试使用模块名称(给定时)和类名来查找包含类声明的文件,以便内省文件的路径。当你这样做时:
WebServices::User.new
Rails将尝试查找目录web_services
,因为其中包含模块名称和文件user.rb
。 A&#34;快速&#34;解决此问题的方法是在项目中创建以下目录结构:
app/
services/
web_services/user.rb
web_services.rb
请注意,您不需要在services
配置中指定autoload
目录,因为app
中的任何目录已经在Rails加载路径中。
答案 2 :(得分:0)
试
config.autoload_paths += Dir[
"#{config.root}/app/services",
"#{config.root}/app/services/**/"
]
答案 3 :(得分:0)
我过去在某个地方遇到同样的问题,
user_services.rb中的(注意:文件名结构在rails中是重要的)
module UserServices
class User
def test_user
Rails.logger.debug 'user works'
end
end
end
您可以通过两种方式解决此问题。
使用
include UserServices
中的WebServices
OR
Webservices.include UserServices