Why am I getting `ArgumentError: wrong number of arguments (given 1, expected 0)` on save?

3.2k Views Asked by At

I have this method that gives me a error ArgumentError: wrong number of arguments (given 1, expected 0) after upgrading to ruby 3.1 at test.save!.

    def seed_test_program
      test = TestProgram.find_or_initialize_by(
        name: "Program",
        code: :program
      )
      test.metadata["status_types"] = [
        "enrolled", "excluded", "rejected", "not_enrolled"
      ]
      test.metadata["status_reasons"] = {
        "excluded" => [
          "reason 1",
          "reason 2",
          "reason 3"
        ],
        'rejected' => [
          "reason 1",
          "reason 2",
          "reason 3"
        ],
        "not_enrolled" => [
          "reason 1",
          "reason 2",
          "other"
        ]
      }
      test.save!
      Test.program.reload
    end

I have tried

      test = TestProgram.find_or_initialize_by({
        name: "Program",
        code: :program
      })

and

      options = {
        name: "Program",
        code: :program
      }
     TestProgram.find_or_initialize_by(**options)

(this method is called as follows Seeds::TestProgram.seed where the seed function contains seed_test_program)

but it keeps giving me the same error. How do I fix this?

Stack Trace

ArgumentError: wrong number of arguments (given 1, expected 0)
/**/app/services/seeds/test_programs.rb:138:in `seed_test_program'
/**/app/services/seeds/test_programs.rb:18:in `seed'
/**/app/services/seeds/test_programs.rb:9:in `initialize'
/**/app/services/seeds/test_programs.rb:5:in `new'
/**/app/services/seeds/test_programs.rb:5:in `seed'
/**/db/seeds.rb:51:in `<main>'
/**/db/sample_data/test_environment.rb:13:in `<main>'
/**/lib/tasks/sample_data.rake:6:in `block (4 levels) in <main>'
Tasks: TOP => db:reset => db:setup => db:seed
(See full trace by running task with --trace)

Test Programs

module Seeds
  class TestPrograms

    def self.seed
      self.new
    end

    def initialize
      seed
    end

    private

    def seed
     seed_test_program
    end

    def seed_test_program
      test = TestProgram.find_or_initialize_by(
        name: "Program",
        code: :program
      )
      test.metadata["status_types"] = [
        "enrolled", "excluded", "rejected", "not_enrolled"
      ]
      test.metadata["status_reasons"] = {
        "excluded" => [
          "reason 1",
          "reason 2",
          "reason 3"
        ],
        'rejected' => [
          "reason 1",
          "reason 2",
          "reason 3"
        ],
        "not_enrolled" => [
          "reason 1",
          "reason 2",
          "other"
        ]
      }
      test.save!
      Test.program.reload
    end
  end
end

Seeds.rb

# Seed Test Programs
Seeds::TestPrograms.seed
1

There are 1 best solutions below

0
On

Solved it. Bizarrely it works if you do

test = TestProgram.find_or_create_by(
        name: "Program",
        code: :program
      )