2016-05-16 3 views
0

命名規則とオートローディングに関する質問があります。Railsアプリケーションで/ app /の下にあるカスタムディレクトリの命名規則は?

私は私の理解では、私はちょうどこのようにそのファイルを作成することができますということでしたapp/presenters/items/item_presenter.rb

でプレゼンターItemPresenterを持つようにしたい:

module Items 
    class ItemPresenter 
    end 
end 

をしかし、私はこれを行う際にItems::ItemPresenterとしてプレゼンターを呼び出そう私はuninitialized constantエラーを取得する:

uninitialized constant Items::ItemPresenter 

def show 
    @presenter = Items::ItemPresenter.new # this is the highlighted line of my Controller 

EDIT:それはDIFについてですのでRails, Custom Folders and Namespacesが重複していませんferentのディレクトリ構造jobs/smth.rb私はpresenters/items/item_presenter.rb(1以上のレベル)を実現しようとしていながら

EDIT2:それは、レールコンソールから作品でもない:NameError: uninitialized constant Items::ItemPresenter

EDIT2:示唆したように私はこれをやってみました:

module Presenters 
    module Items 
    class ItemPresenter 
     def test 
     "hello" 
     end 
    end 
    end 
end 

と私のコントローラの@presenter = Presenters::Items::ItemPresenter.new

uninitialized constant TrialsController::Presenters 

それはレールのように見えないまったく全くありません。

EDIT3:それを考え出した:サンプルアプリhttps://github.com/dontlookforme/test_app

EDIT4を作成しました。私はファイル名を台無しにしました(私が投稿した回答を参照)

+0

あなたはあなたが得ている正確なエラーメッセージを投稿できますか?私はこれをダミーのアプリケーションで作成し、私のレールコンソールで 'Items :: ItemPresenter'を呼び出すことができました。 – sixty4bit

+0

モジュールが必要ですか?プレゼンターはモジュールアイテムとクラスItemPresenterを含んでいますか? –

+0

@ sixty4bit ugh。私のためのレールコンソールでも動作しません:(質問を更新しました – Anton

答えて

1

私は答えを見つけたが、それは何が起こったかを確認するために、@のuser1556912のサンプルアプリ(元の質問でリンク)を参照してくださいする必要があります。

ファイル名はitems_presenter.rb(複数)ですが、クラス名はItemPresenter(単数)です。

@Anthony Eの答えについてのコメントで指摘したように、Railsは/appディレクトリ内のすべてのファイルを自動読み込みするため、これらのファイルについてRailsに明示する必要はありません。ただし、dir階層に一致する名前空間とともに、クラスの名前もファイルの名前と正確に一致する必要があります。この場合、items_presenter.rbの名前をitem_presenter.rbに変更して、クラスをレールコンソールにロードすることができました。

@Anthony Eさんの答えに戻ると、私はItems::名前空間が余計に見えることに同意します。私はちょうどapp/presenters/item_presenter.rbをやります。

0

app/presenters/はプレゼンターを保存するための従来のパスです。実際には、あなたはおそらくアイテムのフォルダのネストなしで行くことができます。

app/presenters/item_presenter.rb

あなたはそれに応じてモジュールパスを更新する必要があります:

module Presenters 
    class ItemPresenter 
     def test 
     "hello" 
     end 
    end 
    end 

その後、あなたは自動的にこのファイルをロードするためのRailsを伝えることができますあなたのapplication.rb

config.autoload_paths << '#{config.root}/app/presenters' 
+0

明示する必要はありません'/ app'のパスを自動ロードします.Railsはすでにそのディレクトリ内のすべてのものを読み込みます'/ lib'の代わりに新しいファイルを置くことのネフィット) – sixty4bit

0

私が間違っていたことは、ファイル名です。 私はプリセッタファイルにitems_presenter.rbという名前を付けましたが、そのクラスにはItemPresenterという名前の特異なItemがありました。

これを修正し、すべてが機能し始めました。

助けてくれてありがとう!

+0

私はすでにあなたの前に2分前に^ _ ^下記を参照してください... – sixty4bit

+1

@ sixty4bitああタイミング:Dあなたが入力している間に投稿しました。どうもありがとうございました! – Anton