In unserem Verzeichnis app
möchten wir, dass einige der Unterverzeichnisse Namespace-Klassen enthalten und einige, die Klassen der obersten Ebene enthalten. Zum Beispiel:Namensraum innerhalb des `app`-Verzeichnisses
app/models/user.rb
definiert::User
app/operations/foo.rb
definiert::Operations::Foo
app/operations/user/foo.rb
::Operations::User::Foo
Unsere application.rb
enthält die folgende Konfiguration definiert:
config.paths = Rails::Paths::Root.new(Rails.root)
config.paths.add 'app/models', eager_load: true
config.paths.add 'app', eager_load: true
Dies funktioniert in den meisten Fällen gut, aber manchmal im Entwicklungsmodus und mit aktiviertem Autorespeichern von Rails führt dies dazu, dass falsche Klassen geladen werden. Zum Beispiel wird ::User
mit Operations::User
verwechselt und umgekehrt.
Gibt es eine Möglichkeit, dieses Verhalten so zu konfigurieren, dass es fehlerfrei funktioniert?
Wenn nicht, ist die einzige Problemumgehung, die ich denken kann, ein zweites Verzeichnis für "namespaced" Klassen in den Zeilen app
und app_namespaced
zu erstellen. Oder sonst app/namespaced
, da der Code auf App-Ebene innerhalb von app
liegen sollte. Aber diese scheinen für mich wie hässliche Umwege zu sein.
Edit: Ein kleines Beispiel wie von @dgilperez gestellt:
# app/models/user.rb
class User
end
# app/models/group.rb
class Group
def some_method
# Since we're in a top-level namespace, User should always
# resolve to ::User. But, depending on some seemingly random
# factors, it sometimes resolves to Operations::User.
User.new
end
end
# app/operations.rb
module Operations
end
# app/operations/user/create.rb
module Operations::User
class Create
def some_method
# Here, as expected, I need to prefix with "::" as
# 'User' would refer to the module we're currently in.
# That's fine and works.
::User.new
end
end
end
Sie voll qualifizierte Konstanten verwenden könnten oder 'require_dependency' wie in [Wenn Konstanten werden nicht verschossen] (http://guides.rubyonrails.org/autoloading_and_reloading_constants.html#when-constants-aren-t- verpasst) – Stefan
Kannst du die Definition der Klassen einfügen? Und der Code, der die Verwirrung verursacht (Anruf und Standort) – dgilperez
Danke für den Blick in diese @ dgilperez, ich habe gerade ein kleines Beispiel hinzugefügt. – Remo