2009-05-24 9 views
10

Ich bin neu in Controller gefunden werden, um diese Ausgabe zu den Schienen und kann nicht herausfinden ...Ruby on Rails-Modell innerhalb Namespace kann nicht

ich einen Controller in

Admin::Blog::EntriesController 

definiert haben app/controllers/admin/Blog/entries_controller.rb

Und ich habe ein Modell

Blog::Entry 

defin genannt ed in app/Modell/Blog/entry.rb

Wenn ich versuche, mein Modell von der Steuerung zuzugreifen, erhalte ich ein "uninitialized constant Admin::Blog::EntriesController::Blog" aus dieser Zeile:

@blog_entries = Blog::Entry.find(:all) 

es den Namespace nicht richtig klar ist das Auffinden, die ist seltsam, denn nach dem, was ich gelesen habe, habe ich mein Modell in den richtigen Ordner mit der richtigen Syntax gelegt.

Irgendwelche Ideen, wie ich das beheben kann?

Dank

Antwort

27

Versuchen:

@blog_entries = ::Blog::Entry.find(:all) 

Aktuelle Zeit ist für die falsche Klasse suchen. Wenn Sie :: vor Blog verwenden, wird es gezwungen, von der obersten Ebene aus zu suchen.

+0

Ah, danke, das hat funktioniert. Es stellt sich jedoch heraus, dass ich auch einen benutzerdefinierten Tabellennamen für mein Modell festlegen muss. Auch das form_for helper funktioniert nicht, da es " _path" -Dinge für das Aktionsattribut benutzt, denke ich, also wirft es einen Fehler, dass es die Methode "blog_entries_path" nicht finden kann ... Irgendwelche Ideen? – nlaq

+0

Ich fange an zu denken, dass Rails auf mehrere Namespaces für Modelle und Controller runzelt ... Was ist eine Schande, weil ich wirklich die

// Pfadstruktur mag. – nlaq

+0

die rails convention ist, dass modellnamen singular sind, während controller plural sind.Vielleicht den Controller umbenennen Admins :: Blogs :: EntriesController (ja, das sieht komisch aus) Vielleicht sollten Sie auch mit Namespaced-Modellen zu denken, sie sind wahrscheinlich mehr Ärger als sie wert sind, siehe http://stackoverflow.com/questions/601768/namespaced-models-in-rails-was-ist-der-status-der-union – levinalex

1

Sie können mit

set_table_name('foo') 

an der Spitze des Modells eine benutzerdefinierte Tabellennamen erreichen.

Wie für mehrere Namespaces, Sie könnten in der Lage sein, um wegzukommen mit

polymorphic_path(@the_object) 

mit Ihrem Urls zu erzeugen, wie es Grund Inferenz tut (meiner Erfahrung nach mindestens, vielleicht nutzt form_for es unter der Haube) .

0

Ja, aus dem Blick auf den Code form_for verwendet polymorphe_path unter der Haube.

3

Es ist jetzt 2011 und wir sind in Rails 3.1 Gebiet, aber dieses Problem tritt noch auf. Ich bin gerade mit einem Namespaced-Controller hineingelaufen, der auf ein nicht-namespaced Modell verweist, , aber nur, wenn es keine Zeilen für dieses Modell in der Datenbank gab!

Das Vorfixieren des Modellnamens mit :: behebt das Problem.

+0

Fand dies mit einigen Tests in Rails 4. Erstellen eines leeren Yml Fixture für das Modell behoben, aber das zugrunde liegende Problem war * einen Namensraum haben, der den gleichen Namen hat wie ein Modell *. – Sooie