2012-02-18 4 views
22

私はインデックスアクションで自分のコントローラーで使用しようとしているクラスを持っています。それを簡単にするためにRailsアプリケーションでグローバルに利用できるようにカスタムクラスを配置する場所はどこですか?

、それはこの

class PagesController < ApplicationController 
    def index 
    @front_page = FrontPage.new 
    end 
end 

FrontPageのように見える、私が定義したクラスです。それを含めるために、私は/ lib /フォルダーに配置しました。 cannot load such file -- /Users/josh/src/ruby/rails/HNReader/lib/front_pageまたは uninitialized constant PagesController::FrontPage

私が/どのようにこのファイルを入れてください:私は、次のいずれかのメッセージを取得しておくなど、require_relative '../../lib/FrontPage.rb'

require 'front_page'require 'FrontPage.rb'require 'FrontPage'しようとしましたが、パスを先頭に追加して、それらの各ましましたオブジェクトをインスタンス化できるように、それをコントローラに含めるのですか?

これは、Rubyの1.9.2 Railsの3.1.3で、OS Xのライオン

+3

'require 'front_page''を試しましたか? – Mischa

+0

@ミシャーはい、引数が必要なのは引用符で囲む必要があります。それを指摘してくれてありがとう。その 'require'を使うと、'このファイルを読み込めません - front_page'というエラーが発生します。 –

答えて

4
私たちは、単にファイルをロードする必要が

class PagesController < ApplicationController 
    require 'front_page.rb' 
    def index 
    @front_page = FrontPage.new 
    end 
end 

のlib/front_page.rb

class FrontPage 
end 

我々はまた、application.rbを設定することができますこれらのファイル

# Custom directories with classes and modules you want to be autoloadable. 
# config.autoload_paths += %W(#{config.root}/extras) 

第2のオプションが望ましい解決策です。

+0

はい、私はそれを試しました。私はクラス定義の外に置いていますが、クラス定義の中に入れてチェックすると 'まだこのようなファイルを読み込めません - front_page。rb' –

7

このファイルの名前はFrontPage.rbです。名前を 'front_page.rb'に変更し、クラス名を 'FrontPage'として残して問題を解決しました。

+3

規約はJava固有ではありません。 http://en.wikipedia.org/wiki/CamelCase – 0112

23

front_page.rbをロードパスのどこかに配置する場合は、require 'front_page'を使用することができます。すなわち:このはず作品:

require 'front_page' 
class PagesController < ApplicationController 
    def index 
    @front_page = FrontPage.new 
    end 
end 

は、あなたのロードパスを確認するには、これを試してみてください。

$ rails console 
ree-1.8.7-2011.03 :001 > puts $: 
/Users/scottwb/src/my_app/lib 
/Users/scottwb/src/my_app/vendor 
/Users/scottwb/src/my_app/app/controllers 
/Users/scottwb/src/my_app/app/helpers 
/Users/scottwb/src/my_app/app/mailers 
/Users/scottwb/src/my_app/app/models 
/Users/scottwb/src/my_app/app/stylesheets 
# ...truncated... 

あなたはこの例では見ることができ、最初の行は、プロジェクトのlibディレクトリですあなたはfront_page.rbと言っています。あなたが行うことができます

もう一つは、あなたのconfig/application.rbでこれを追加することです:あなたもrequireを必要としないので、それをしなければなら

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

。代わりにRailsはそれを自動ロードします(そして、あなたのlibディレクトリ内のすべてのものは注意してください)。

+0

オートローディングが鍵です – Donato

+0

あなたに感謝します:質問:libディレクトリに*すべての*を自動ロードするのは危険か危険ですか? – BKSpurgeon

関連する問題