ruby​​ class method无法将其他用户输入推送到数组

问题描述:

它存储第一名员工,但是当我尝试添加其他员工时,我无法查看输入的其他员工。以下是查看员工记录的方法。谢谢你的帮助!ruby​​ class method无法将其他用户输入推送到数组

Employee类

class Employee 
    attr_accessor :employee, :role, :location 

    def initialize(employee, role, location) 
    @employee = employee 
    @role = role 
    @location = location 
    end 

    def employee_change(new_emp) 
    @employee = new_emp 
    end 

    def role_change(new_role) 
    @role = new_role 
    end. 


    def location_change(new_loc) 
    @location = new_loc 
    end 
end 

主菜单

def main_menu 
    puts "Welcome to the Employee Portal" 
    puts "Please select an option below: " 
    puts "---------------------" 
    puts "1. Create New Employee Record." 
    puts "2. View an existing record." 
    puts "3. Modify an existing record." 
    puts "4. Exit Portal" 

    option = gets.chomp.to_i 

    if option == 1 
    create_record 
    main_menu 

    elsif option == 2 
    view_record 

    elsif option == 3 
    modify 

    elsif option == 4 
    puts "Thank you for using the Employee Portal" 
    exit 
    else 
    puts "Not a valid option. Please try again." 
    main_menu 
    system("clear") 

    end 
end 

创建新员工(从主菜单选项1)

def create_record 
    puts "Create New Employee Record, click 'Enter' to begin" 
    puts "Enter Employee Information: " 
    employee = gets.chomp.capitalize 

    puts "Enter Employee's Role: " 
    role = gets.chomp.capitalize 

    puts "Enter Employee's Current Work Location: " 
    location = gets.chomp.capitalize 

    puts "\n" 

    new_record = Employee.new(employee, role, location) 
    @record.push(new_record) 

    puts "New Employee Record has been created." 
    puts "Name: #{employee}" 
    puts "Role: #{role}" 
    puts "Location: #{location}" 

    system("clear") 

    main_menu 
end 

查看员工(选项2从主菜单)

def view_record 
    puts "Enter Employee Name to view record: " 
    name = gets.chomp.capitalize 
    system("clear") 

    @record.each do |a| 
    if a.employee == name 

     puts "\n" 
     puts "Employee Information " 
     puts "--------------------" 
     puts " Name : #{a.employee}" 
     puts " Role(s) : #{a.role}" 
     puts " Location(s) : #{a.location}" 
     puts " Type 'Exit' to return to the Main Menu " 

    else 
     puts "That is not a valid entry, please try again." 
     view_record 
     main_menu 
    end 
    end 
end 

修改员工(选项3从主菜单)

def modify 
    system("clear") 
    puts "Enter employee name to modify existing record: " 
    name = gets.chomp.capitalize 

    @record.each do |r| 
    if r.employee == name 
     puts "Employee found." 
     puts "Select an option to modify." 
     puts "-----------------------------------" 
     puts "1.) Modify employee's name." 
     puts "2.) Modify employee's role." 
     puts "3.) Modify employee's location." 
     puts "4.) Return to Main Menu" 
     puts "\n" 

     option = gets.chomp.to_i 

     if option == 1 
     change_employee 

     elsif option == 2 
     change_role 

     elsif option == 3 
     change_location 

     elsif option == 4 
     main_menu 
     else 
     puts "Invalid selection. Please try again." 
     modify 
     end 
    end 
    end 
end 

更改员工(从修改项1)

def change_employee 
    puts "Enter new employee name: " 
    new_emp = gets.chomp.capitalize 
    @record.each do |r| 
    if r.employee == employee 
     r.employee_change(new_emp) 
     puts "#{r.employee} has been updated to #{r.employee}" 
    end 
    end 
end 

C焊割员工角色(选项2修改)

def change_role 
    puts "What is #{r.employee}\'s new role?: " 
    new_role = gets.chomp.capitalize 
    @record.each do |r| 
    if r.employee == employee 
     r.role_change(new_role) 
     puts "#{r.employee}\'s new role is #{r.role}" 
    end 
    end 
end 

更改员工的位置(从修改选项3)

def change_location 
    puts "What is #{r.employee}\'s new location?: " 
    new_loc = gets.chomp.capitalize 
    @record.each do |r| 
    if r.employee == employee 
     r.location_change(new_loc) 
     puts "#{r.employee} has been transfer to new location, #{r.location}." 
    end 
    end 
end 

运行程序

@record = [] 
system("clear") 
main_menu 
+1

这不是一个答案,而是一个建议。通常在ruby风格中,你会命名一个数组/列表“@ records”而不是“@ record”,只是因为它更清晰。大多数开发人员会看到@record并认为“单个数据库记录”。 – whodini9

+6

究竟发生了什么?你怎么知道它不起作用?你是否验证过该数组包含你认为它所做的事情? –

+3

如果您在描述发生的事情时不得不说“无法”,那么您可能不会让问题变得足够清晰。代码是否在物理上阻止你做某件事情?当您尝试调用特定操作时,鼠标是否会咬你?应用程序崩溃了吗? ;) – coreyward

的问题是用你的view_record方法。如果将其更改为如下所示:

def view_record 
    puts "Enter Employee Name to view record: " 
    name = gets.chomp.capitalize 
    system("clear") 

    if a = @record.detect { |rec| rec.employee == name } 
    puts "\n" 
    puts "Employee Information " 
    puts "--------------------" 
    puts " Name : #{a.employee}" 
    puts " Role(s) : #{a.role}" 
    puts " Location(s) : #{a.location}" 
    puts " Type 'Exit' to return to the Main Menu " 
    else 
    puts "That is not a valid entry, please try again." 
    view_record 
    end 
end 

它正常工作。

问题是您在@record的每条记录上都打电话if...else声明。因此,如果您创建2 Employee s第一个名为“约翰”和第二个名为“简”。当你去查看“简”时,你可以拨打else作为“约翰”的一部分,因为他是第一个记录,然后一旦他完成else,你可以将if部分称为“简”。然而,对于“John”,else永远不会返回,因为在最终完成一个[可能很长的] view_record调用的堆栈后,您将返回到main_menu,这永远不会返回(由于该方法中的最终else条件即重新呼叫main_menu

希望帮助和合理。

注:

  1. modify似乎有同样的问题和change_x方法将遍历和检查对if语句中的每个员工,但因为没有else没问题(我还是会改变他们的个人,以及在这些上使用detect)。
  2. change_x方法并不像他们会跑,因为employee没有在此定义
  3. 如果超过1名员工可以有相同的名字,你可以使用select代替detect然后检查empty?或只遍历select返回的内容,并只调用其中的if部分。