5

次のように、モデルで定義されたいくつかの定数を使用する lib ディレクトリにファイルがあります。

class User < ActiveRecord::Base
   MAX_EMAIL_ADDRESS_LENGTH = 255
end

そして、私はlib/foo.rbにあります

module Foo
  LONG_EMAIL_ADDRESS = "foo@bar.com".rjust(User::MAX_EMAIL_ADDRESS_LENGTH, "a")
end

クラス User が見つからないために失敗します。libのそのファイルの前にユーザーをロードするにはどうすればよいですか?

これを私のapplication.rbに入れて、そのファイルをロードしています:

config.autoload_paths += %W(#{config.root}/lib)
4

5 に答える 5

3

解決策は、/lib にある私のファイルが実際には rake ファイルで必要とされていたため、自動ロード システム全体が Rails によってセットアップされる前に rake ファイルがロードされたようで、モデルを見つけることができませんでした。.rake ファイルから require を削除すると、すべてが機能し始めました。

于 2012-07-25T06:24:11.573 に答える
3

最初の部分は正しく行われました:

config.autoload_paths += %W(#{config.root}/lib)

次に重要なのが、モジュール

module Foo
  ...
end

に配置する必要があります

lib/foo.rb

ファイル。

そして、includeアプリケーションコードに組み込むことができます。

class Comment < ActiveRecord::Base
  include Foo
  ...
end

libディレクトリのファイルfoo.rbを含めることを意図していない場合(おそらく間違った方法です)、このコード内でRailsモデルやその他のものを使用するには、これをfoo.rbに入れる必要があります:

require_relative "../config/environment.rb"
于 2012-07-24T18:46:46.680 に答える
1

デフォルトでは、YourApplicationNameHere::Application.autoload_pathsです[]。私は(純粋に組織上の理由から)app/models自分のディレクトリにもグロブを追加します。

config.autoload_paths += Dir["#{Rails.root}/app/models/**/"]
config.autoload_paths += Dir["#{config.root}/lib"]

この設定により、問題なく質問で求めていることを実行できます。これは、モジュールのインスタンス化User内からモデルが見つからない場合に Rails にどこを探すべきかを伝えることにも役立ちます。lib/

編集

質問で正確なエラー メッセージを指定することも役に立ちます。

uninitialized constant Foo::User

は、Ruby/Rails が名前空間User内で探していることを意味します。グローバル名前空間へのルックアップを強制するには、Foo接頭辞Userを付けます。::

module Foo
  LONG_EMAIL_ADDRESS = "foo@bar.com".rjust(::User::MAX_EMAIL_ADDRESS_LENGTH, "a")
end
于 2012-07-24T14:13:06.820 に答える
1

「モデル」以外の場所に「user.rb」がない限り、クラス User がインスタンス化されていないように見えますが、これは異常なようです。クラスが特にそのディレクトリにない限り、開発中にクラスがロードされないことがよくありますが、私が使用する1つの解決策は、問題のある行の前に呼び出されると予想されるコード内に配置できるこの行です。 ..

Rails.application.eager_load! if Rails.env == "development"

条件部分はおそらく不要ですが、その影響が開発中にのみ発生することを確認するために含めています。

于 2012-07-24T14:19:02.220 に答える