When rails fixtures and namespaces collide
Testing helps Rails apps work properly and stops bugs. Fixtures are a useful testing tool. But fixtures can cause problems when models are namespaced.
Say your app has a regular Vehicle
model and a namespaced Vehicles::Car
model. By convention, you'd think to place the fixtures in vehicles.yml
and vehicles/cars.yml
, respectively.
Doesn't work. Rails tries to load the fixtures from vehicles/cars.yml
into Vehicle
.
Here is why: Rails uses both the fixture file name and path to find the right model. vehicles.yml
goes to Vehicle
based on the name. But so does vehicles/cars.yml
based on the path.
Don't just rename your model classes or namespaces to work around this.
Instead, move vechicles/cars.yml
to vehicles_cars.yml
(ie, it must not be in the vechicles
folder), and add these lines at the top of the file:
_fixture: model
class: Vehicles::Car
Now rails loads vehicles_cars.yml
into Vehicles::Car
, avoiding the collision.
In summary:
Rails matches fixtures using name and path
Collisions happen when name of one class matches the path of another
Specify the model class explicitly rather than renaming your classes and namespaces
Explicit model classes remove guesswork. Fixtures load properly. Tests run cleanly. Careful fixture setup prevents headaches.