Rubocop Lint: Useless assignment to variable

please i am having some troubles with my code It runs perfectly in the console but the linters keep failing with the error below.

this is the error

    user_name = gets.chomp
refactored.rb:14:5: W: Lint/UselessAssignment: Useless assignment to variable - user_age. Did you mean user_name?
    user_age = Integer(gets.chomp)
    ^^^^^^^^

this is the code

require './school-library/student'
require './school-library/rental'
require './school-library/persons'
require './school-library/teacher'
require './school-library/book'

class Methods
  def initialize
    @person_array = []
  end

  def user_input
    print 'Age: '
    user_age = Integer(gets.chomp)

    print 'Name: '
    user_name = gets.chomp
  end

  def create_person
    puts 'Do you want to create a student (1) or a teacher (2)? [Input the number]: '
    person_option = Integer(gets.chomp)
    case person_option
    when 1
      (user_age, user_name) = user_input

      print 'Has parent permission? [Y/N]: '
      user_permission = gets.chomp.to_s.upcase

      case user_permission
      when 'Y'
        user_permission = true
      when 'N'
        user_permission = false
      end
      student = Student.new(user_age, user_name, parent_permission: user_permission)
      @person_array.push({
                           output: "[Student] Name: #{student.name}, ID: #{student.id}, Age: #{student.age}",
                           object: student
                         })

      puts 'Person created successfully!'
      puts "\n"
    when 2
      (user_age, user_name) = user_input

      print 'Specialization: '
      user_specialization = gets.chomp

      teacher = Teachers.new(user_age, user_name, user_specialization)
      @person_array.push({
                           output: "[Teacher] Name: #{teacher.name}, ID: #{teacher.id}, Age: #{teacher.age}",
                           object: teacher
                         })

      puts 'Person created successfully!'
      puts "\n"
    else
      puts 'Person not created.'
    end
  end

  def people_list
    @person_array.each do |person|
      puts person[:output]
    end
  end

  def person_rent
    @person_array.each_with_index do |person, index|
      puts "#{index}) #{person[:output]}"
    end
  end
end

class BooksList
  def initialize
    @books = []
  end

  def create_book
    print 'Title: '
    book_title = gets.chomp

    print 'Author: '
    book_author = gets.chomp

    puts 'Book created successfully!'

    book = Book.new(book_title, book_author)
    @books.push({
                  output: "Title: #{book.title}, Author: #{book.author}",
                  object: book
                })
  end

  def book_list
    @books.each do |book|
      puts book[:output]
    end
  end

  def rent_book
    @books.each_with_index do |book, index|
      puts "#{index}) #{book[:output]}"
    end
  end
end


Solution 1:

RuboCop is trying to tell you that a useless variable exists in your code, but before fix that we need to talk about a bug happening right here:

(user_age, user_name) = user_input

In Ruby, a method returns the last line of code. Looking at the method user_input we can see that it returns only the user_name variable. The problem is that the (user_age, user_name) expects two values. The first is being assigned, but the second is given nil.

To fix that, update the method user_input to:

def user_input
  print 'Age: '
  user_age = Integer(gets.chomp)

  print 'Name: '
  user_name = gets.chomp

  [user_age, user_name]
end

This will fix both the RuboCop offense and the bug.