2013-06-17 18 views
6

Ich habe ein Problem mit einem Modulnamen und der Ordnerstruktur.Rails Modul/Ordner Namenskonvention

Ich habe ein Modell definiert als

module API 
    module RESTv2 
    class User 
    end 
    end 
end 

Die Ordnerstruktur wie

sieht
models/api/restv2/user.rb 

Beim Versuch, die Klasse zuzugreifen, erhalte ich eine nicht initialisierte Konstante Fehler. Wenn ich jedoch den Modulnamen in REST und den Ordner in/rest ändere, erhalte ich den Fehler nicht.

Ich gehe davon aus das Problem hat mit der Benennung des Ordners zu tun, und ich habe alle verschiedenen Kombinationen von/rest_v_2 versucht,/rest_v2,/restv_2 usw.

Irgendwelche Vorschläge?

+3

Nach der Rails-Konvention hast du dein Modul falsch benannt.' RESTv2' sollte 'RestV2' sein – meagar

Antwort

7

Rails uses die ‚Unterstrich‘ Methode auf einem Modul oder Klassennamen zu versuchen, herauszufinden, welche Datei zu laden, wenn es über eine Konstante kommt es noch nicht kennt. Wenn Sie das Modul durch diese Methode ausführen, es scheint nicht die intuitive Ergebnis zu geben:

irb(main):001:0> "RESTv2".underscore 
=> "res_tv2" 

Ich bin nicht sicher, warum Strich diese Wahl macht, aber ich wette, Ihr Modul dir auf die obige Umbenennung würde behebe dein Problem (obwohl ich es vorziehe, es einfach in "RestV2 oder RESTV2 umzubenennen, so dass der Verzeichnisname normal ist).

+7

Das macht eigentlich Sinn, es ist die Zeichenfolge 'RESTv2', die nicht der Konvention folgt. Die Annahme ist, dass das erste Wort eine Art Akronym wie" PIN "ist und das zweite Wort ein Großbuchstabe wie" Importeur "ist. : 'PINImporter' =>' pin_importer', 'UUIDGenerat oder '=> 'uuid_generator',' AESCracker' => 'aes_cracker',' RESTv2' => 'res_tv2' usw. In allen Fällen der CamelCase-Konvertierung ist es nicht" CamelC ase ", es ist" Camel Case ". Der Platz wird * vor * der letzte Großbuchstabe eingegeben, nicht danach. – meagar

+0

Ich vermute, der Fall von "v" ist, was bewirkt, dass das Wort vor dem "T" bricht. –

+0

Danke für die Hilfe. – KPheasey

5

Sie müssen Rails für das automatische Laden in den Unterverzeichnissen des Verzeichnisses app/model konfigurieren. Setzen Sie dies in Ihre config/application.rb:

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

Dann sollten Sie in der Lage sein, diese Dateien automatisch zu laden.

Auch Ihr möglicher Dateiname muss app/model/api/res_tv2/user.rb sein, da Rails String.underscore verwendet, um den Dateinamen zu bestimmen. Ich würde es einfach API :: V2 :: User nennen, um Kopfschmerzen zu vermeiden, es sei denn, Sie haben mehr als einen API-Typ.