{"record":{"id":"595b723a98784084","repo":"thoughtbot/factory_bot","slug":"component-name-already-registered-name","errorCode":null,"errorMessage":"#{@component.name} already registered: #{name}","messagePattern":"#(.+?) already registered: #(.+?)","errorType":"exception","errorClass":"FactoryBot::DuplicateDefinitionError","httpStatus":null,"severity":"error","filePath":"lib/factory_bot/decorator/disallows_duplicates_registry.rb","lineNumber":6,"sourceCode":"module FactoryBot\n  class Decorator\n    class DisallowsDuplicatesRegistry < Decorator\n      def register(name, item)\n        if registered?(name)\n          raise DuplicateDefinitionError, \"#{@component.name} already registered: #{name}\"\n        else\n          @component.register(name, item)\n        end\n      end\n    end\n  end\nend\n","sourceCodeStart":1,"sourceCodeEnd":14,"githubUrl":"https://github.com/thoughtbot/factory_bot/blob/18ae8b581bf55de681c8adb5f74d32787fd2157f/lib/factory_bot/decorator/disallows_duplicates_registry.rb#L1-L14","documentation":"DuplicateDefinitionError raised by Decorator::DisallowsDuplicatesRegistry#register when FactoryBot.define registers a factory, trait, or sequence whose name is already in the registry. The factories, traits, and sequences registries are wrapped with this decorator; the message's first word comes from @component.name and tells you which registry collided (Factory/Trait/Sequence).","triggerScenarios":"Two `factory :user` blocks loaded in the same run (same file, or two files under spec/factories); defining a global sequence with the same name twice; re-requiring a factories file from multiple spec helpers without FactoryBot.reload in between; `FactoryBot.define` executed again in a rake task or console session after definitions are already loaded.","commonSituations":"Copy-pasted factory files; spec support files required multiple times; reloading code in a rails console or with Spring where definitions persist; monorepos or shared engines where two apps define `factory :user`; renaming a factory while leaving the old definition behind.","solutions":["Find the collision: `grep -rn 'factory :user' spec/` (or trait/sequence names) and delete or rename one definition.","If files are intentionally re-required (pry, reload tasks), call FactoryBot.reload between loads to clear registries first.","Compose variations with traits instead of duplicating whole factories (`factory :user` + `trait :admin`).","Guard conditional definitions: `unless FactoryBot.factories.registered?(:user)`."],"exampleFix":"# before\n# spec/factories/user.rb\nFactoryBot.define { factory :user { name { 'Plain' } } }\n# spec/factories/admin.rb (same run)\nFactoryBot.define { factory :user { name { 'Admin' } } } # DuplicateDefinitionError\n\n# after\n# one file, variations via traits\nFactoryBot.define do\n  factory :user do\n    name { 'Plain' }\n\n    trait :admin do\n      name { 'Admin' }\n    end\n  end\nend","handlingStrategy":"validation","validationCode":"# guard against re-registration, e.g. in reloaded spec helpers\nname = :user\nif FactoryBot.factories.registered?(name)\n  warn \"skipping re-definition of :user\"\nelse\n  FactoryBot.define { factory(name) { name { 'Plain' } } }\nend","typeGuard":"->(name) { !FactoryBot.factories.registered?(name) }","tryCatchPattern":"begin\n  FactoryBot.define { #...\n }\nrescue FactoryBot::DuplicateDefinitionError => e\n  # e.message names the registry and the duplicate; rename/remove one, or FactoryBot.reload\nend","preventionTips":["Give factories unique names across files; model variations as traits instead of duplicate factories.","Call FactoryBot.reload when re-requiring factory files (console, reload tasks).","Keep all definitions in one canonical factories directory; avoid defining factories inside individual *_spec.rb files."],"tags":["ruby","factory-bot","duplicate","registry","definition"],"backgroundTag":"duplicate-definition","analyzedSha":"18ae8b581bf55de681c8adb5f74d32787fd2157f","analyzedAt":"2026-08-21T18:25:33.545Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}