2012-07-24 8 views
5

は、私のような、モデルで定義されたいくつかの定数を使用してlibディレクトリ内のファイルを持っている:アクセスモデル

class User < ActiveRecord::Base 
    MAX_EMAIL_ADDRESS_LENGTH = 255 
end 

し、私はlibに/ fooの中に持っています。 rb

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

私はapplication.rbでこれを持っていることによって、そのファイルをロードしています:デフォルトでは

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

:私は私のタスクを呼び出すとき

task :foo_task => [:environment] do 

が、それは正しくはFooの数を置く:だから私はちょうど私のタスクの宣言にこれを追加しました?レール3では、デフォルトで自動ロードされないので、 'lib/foo.rb'へのアクセス方法を示すことは役に立ちます。 – deefour

+0

@Deefour、done。 – Pablo

+0

このモジュールは含まれていますか?もしそうなら、それはどこに含まれていますか? –

答えて

2

ソリューションでした、/ libに私のファイルは、実際にすくいファイルによって要求され、それが見つけることができませんでしたので、それは、レールによってセットアップされるすくいファイルは全自動負荷系の前にロードされているようですされていたことモデル。 .rakeファイルからrequireを削除した後、すべてが動作するようになりました。

1

YourApplicationNameHere::Application.autoload_paths[]です。私(純粋に組織的な理由のため)私のapp/modelsディレクトリのglobを追加してください。

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

この設定では、問題で質問していることを問題なく実行できます。あなたのlib/モジュールのインスタンス化の中からUserモデルが見つからない場合、Railsにどこに見えるかを伝えることで、これもあなたにとって有益でしょう。あなたの質問で正確なエラーメッセージを指定

編集

はあまりにも役立っています。

uninitialized constant Foo::User 

は、Ruby/Railsが Foo名前空間内 Userを探していることを意味します。プレフィックス User::とし、グローバル名前空間にルックアップを強制します。

module Foo 
    LONG_EMAIL_ADDRESS = "[email protected]".rjust(::User::MAX_EMAIL_ADDRESS_LENGTH, "a") 
end 
+0

それは私にとってはうまくいきませんでした。私はいくつかのバリエーションを試してみました。私はいつも:初期化されていない定数Foo :: Userで終わります。 – Pablo

+0

私の編集をご覧ください。 – deefour

0

あなたが「モデル」以外の場所で「user.rb」を持っていない限り、珍しい思われる、あなたのクラスのユーザーがインスタンス化されていないことが表示されます。クラスが開発中にロードされていない場合がよくありますが、私が使用する解決策の1つは、あなたのコード内に置くことができる行です。 ..

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

条件部分はおそらく不要ですが、私はそれだけでその効果が唯一の開発で発生する特定のことを含んでいます。最初の部分が正しく行われた

1

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

次に、それは重要であり、モジュール

module Foo 
    ... 
end 

lib/foo.rb 

ファイルに配置する必要があります。

そして、アプリケーションコードにincludedとすることができます。

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

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

require_relative "../config/environment.rb" 
+0

モデルからlibにアクセスしようとしていませんが、libファイルのモデルにアクセスしようとしています。 – Pablo

+0

'require_relative"を試してください../config/ environment.rb "' –

2

これは古い質問ですが、私はちょうど同じ問題に直面しており、いくつかの検索の後に解決策を見つけましたので、共有する価値があると思います。

my/libディレクトリにある1つの必須ファイルに "Foo"というモデルを使用したかったのです。まず、私はこれをしなかったし、それはうまくいきませんでした:

# in my rake file 
task :foo_task do 
    require /some_path/lib/bar.rb 
end 

# in /lib/bar.rb 
puts "Foo = #{Foo.count} " 

# => uninitialized constant Foo 

がいくつか検索した後、私は私のlibのファイルにアクセスモデルに、私は私の仕事環境を指定する必要があることがわかりました。どのようにあなたのRailsアプリケーションでlib` `含めている

# => Foo = 6