尝试在Rails应用程序中定义新模块时出错

时间:2013-03-02 14:40:00

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2

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

有人帮助我吗?

4 个答案:

答案 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

在user_services.rb

末尾的

Webservices.include UserServices