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

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

Rails3.2.11およびRuby1.9.3p194

誰か助けてくれますか?

4

4 に答える 4

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 に答える
1

これは、Railsがモジュール名(指定されている場合)とクラス名を使用してクラスの宣言を含むファイルを検索し、ファイルへのパスをイントロスペクトするためです。あなたがするとき:

WebServices::User.new

web_servicesRailsは、モジュール名とその中のファイルのためにディレクトリを見つけようとしますuser.rb。この問題を解決する「高速」な方法は、プロジェクトに次のdir構造を作成することです。

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

内部のディレクトリはすでにRailsのロードパスにあるためservices、構成でディレクトリを指定する必要はないことに注意してください。autoloadapp

于 2013-03-06T01:51:25.680 に答える
0

私は過去どこかで同じ問題に直面しました、

user_services.rb内(注:ファイル名の構造はrailsで重要です)

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

この問題を解決する2つの方法。

ORinclude UserServicesで使用 WebServices

Webservices.include UserServicesuser_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 に答える