3

我正在尝试在我的 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

用户.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.11Ruby 1.9.3p194

有人帮助我吗?

4

4 回答 4

1

这是因为 Rails 尝试使用模块名(如果给定)和类名来查找包含类声明的文件,以内省文件的路径。当你这样做时:

WebServices::User.new

Rails 将尝试web_services根据模块名称查找目录以及其中的文件user.rb。解决此问题的“快速”方法是在您的项目中创建以下目录结构:

app/
  services/
    web_services/user.rb
    web_services.rb

请注意,您不需要services在配置中指定目录autoload,因为其中的任何目录app都已经在 Rails 加载路径中。

于 2013-03-06T01:51:25.680 回答
1

错误消息清楚地说,加载程序能够找到并尝试加载user.rb. 因此,玩config.autoload_paths不会解决问题。

当有人定义了意外映射到现有文件名的模型时,通常会发生此错误。尝试重命名User为 smth 非常不同:

~ cat …/myuser.rb
class MyUser
  def test_user
    Rails.logger.debug 'user works'
  end
end

这应该使它工作。

于 2013-03-03T07:58:04.010 回答
0

我过去在某个地方遇到过同样的问题,

在 user_services.rb 中(注意:文件名结构在 rails 中很重要)

module UserServices
  class User
    def test_user
      Rails.logger.debug 'user works'
    end
  end
end

有两种方法可以解决这个问题。

用于 或include UserServices_WebServices

Webservices.include UserServices在 user_services.rb 的末尾

于 2013-03-03T14:17:12.903 回答
0

尝试

config.autoload_paths += Dir[
  "#{config.root}/app/services",
  "#{config.root}/app/services/**/"
]
于 2013-03-02T17:27:01.063 回答