{"record":{"id":"5ffe4727d205ced6","repo":"voormedia/rails-erd","slug":"saving-diagram-failed-output-directory-file-di-5ffe47","errorCode":null,"errorMessage":"Saving diagram failed!\nOutput directory '#{File.dirname(filename)}' does not exist.","messagePattern":"Saving diagram failed!\nOutput directory '#(.+?)' does not exist\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"lib/rails_erd/diagram/mermaid.rb","lineNumber":106,"sourceCode":"\n          to.children.each do |child|\n            graph << \"\\t#{quote_entity_name(from.name)} #{er_relation_notation(relationship)} #{quote_entity_name(child.name)} : \\\"\\\"\"\n          end\n        else\n          graph << \"\\t`#{from.name}` #{relation_arrow(relationship)} `#{to.name}`\"\n\n          from.children.each do |child|\n            graph << \"\\t`#{child.name}` #{relation_arrow(relationship)} `#{to.name}`\"\n          end\n\n          to.children.each do |child|\n            graph << \"\\t`#{from.name}` #{relation_arrow(relationship)} `#{child.name}`\"\n          end\n        end\n      end\n\n      save do\n        raise \"Saving diagram failed!\\nOutput directory '#{File.dirname(filename)}' does not exist.\" unless File.directory?(File.dirname(filename))\n\n        # Emit clustered entities if not already emitted (e.g., no relationships)\n        if @clustering_enabled && !@clustered_entities_emitted\n          emit_clustered_entities\n          @clustered_entities_emitted = true\n        end\n\n        File.write(filename.gsub(/\\s/,\"_\"), graph.uniq.join(\"\\n\"))\n        filename\n      end\n\n      def filename\n        \"#{options.filename}.mmd\"\n      end\n\n      def diagram_type\n        er_diagram? ? \"erDiagram\" : \"classDiagram\"\n      end","sourceCodeStart":88,"sourceCodeEnd":124,"githubUrl":"https://github.com/voormedia/rails-erd/blob/dae6e52018c94ff6d3e3bb0fdbc2cb0c680ec165/lib/rails_erd/diagram/mermaid.rb#L88-L124","documentation":"The Mermaid generator's save callback (mermaid.rb:105-106) applies the same guard as Graphviz before writing: filename resolves to options.filename + '.mmd' (mermaid.rb:118-120), and unless File.directory?(File.dirname(filename)) it raises before File.write runs. Mermaid output is pure Ruby with no external binary, so this directory check is the only save-time failure mode; with the default filename 'ERD' the dirname '.' always exists, and the error fires when generator: :mermaid runs with a filename option pointing into a directory that does not exist.","triggerScenarios":"rake erd generator=mermaid filename=docs/ERD, or RailsERD.options[:generator] = :mermaid with erd.filename = 'docs/erd', when docs/ is missing; any environment where the configured output directory was never created.","commonSituations":"CI clean checkouts where doc/ or db/diagrams/ is gitignored; switching generator from graphviz to mermaid while reusing a nested filename config; the output directory renamed after the config was written.","solutions":["Create the directory: mkdir -p docs","Or point filename at an existing directory","Or create it programmatically: require 'fileutils'; FileUtils.mkdir_p(File.dirname(path)) before generating"],"exampleFix":"# before\nRailsERD::Diagram::Mermaid.create(filename: 'docs/ERD')\n# => RuntimeError: Saving diagram failed! Output directory 'docs' does not exist.\n\n# after\nrequire 'fileutils'\nFileUtils.mkdir_p('docs')\nRailsERD::Diagram::Mermaid.create(filename: 'docs/ERD')","handlingStrategy":"validation","validationCode":"path = File.join('docs', 'ERD.mmd')\nrequire 'fileutils'\nFileUtils.mkdir_p(File.dirname(path))\nRailsERD::Diagram::Mermaid.create(filename: 'docs/ERD')","typeGuard":null,"tryCatchPattern":"begin\n  RailsERD::Diagram::Mermaid.create(filename: 'docs/ERD')\nrescue RuntimeError => e\n  raise unless e.message.include?('Output directory')\n  require 'fileutils'\n  FileUtils.mkdir_p('docs')\n  retry\nend","preventionTips":["mkdir_p the output directory before generating","Keep empty output directories in version control (.keep)","Remember Mermaid needs no Graphviz binary - this directory check is its only save-time failure"],"tags":["ruby","rails-erd","mermaid","filesystem","output-path","directory-missing"],"backgroundTag":"output-directory-not-found","analyzedSha":"dae6e52018c94ff6d3e3bb0fdbc2cb0c680ec165","analyzedAt":"2026-08-23T02:52:18.679Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}