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
答
的问题是用你的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
)
希望帮助和合理。
注:
- 的
modify
似乎有同样的问题和change_x
方法将遍历和检查对if
语句中的每个员工,但因为没有else
没问题(我还是会改变他们的个人,以及在这些上使用detect
)。 - 的
change_x
方法并不像他们会跑,因为employee
没有在此定义 - 如果超过1名员工可以有相同的名字,你可以使用
select
代替detect
然后检查empty?
或只遍历select
返回的内容,并只调用其中的if
部分。
这不是一个答案,而是一个建议。通常在ruby风格中,你会命名一个数组/列表“@ records”而不是“@ record”,只是因为它更清晰。大多数开发人员会看到@record并认为“单个数据库记录”。 – whodini9
究竟发生了什么?你怎么知道它不起作用?你是否验证过该数组包含你认为它所做的事情? –
如果您在描述发生的事情时不得不说“无法”,那么您可能不会让问题变得足够清晰。代码是否在物理上阻止你做某件事情?当您尝试调用特定操作时,鼠标是否会咬你?应用程序崩溃了吗? ;) – coreyward