我使用的是上面的Ruby 2.7。我一直在做这项工作,而且还在学习。我确信我没有使用正确的代码。这个任务需要我做一个模拟atm程序。其中一个要求是,在用户可以访问程序之前,我需要检查用户的有效输入是否与CSV文件中的数据匹配。
我正在使用ruby(不允许使用rails或任何高级ruby代码(。我在任何地方搜索类似的程序以供参考,但大多不涉及CSV文件。如何检查来自用户的输入是否有效并与CSV文件匹配?我在如何进行验证以及如何使用两个输入(用户名和密码(进行验证方面遇到了问题。此程序在命令行上运行。如果我不够清楚,请道歉。你能从我的代码中告诉我哪里出错了吗?
我有三个.rb文件和两个csv文件。我不确定是否应该创建两个单独的csv文件。
- 函数.rb(其中包含所有函数(
- login.rb(在转到system.rb文件之前,请验证"user.csv"文件中的用户名和密码(
- system.rb(所有数据保存或更改在"account.csv"文件中的主文件(
下面是function.rb
文件。
require 'csv'
class Function
def log_in(user)
CSV.foreach('user.csv', 'r', headers => true) do |row|
#check the user is valid, else error
if row[0] == uname && row[1] == pwd
puts "succesfully login"
ATMSystem.main_menu
end
end
if login == false
puts "invalid credentials."
Login.log_menu
end
end
login.rb
文件
require './function'
class Inn
def signin
function = AtmFunction.new
puts "Account login"
puts "Enter username"
uname = gets.chomp
puts "Enter password"
pwd = gets.chomp
user = [uname, pwd]
function.log_in(user)
end
end
假设这是您的users.csv
文件:
name,password
bob,1234
alice,5678
这是一个可能的选择。
将文件加载到一个散列数组Enumerable#to_h和Hash#transform_keys:
require 'csv'
data_file = 'user.csv'
user_map = CSV.foreach(data_file, headers: true).map do |row|
row.to_h.transform_keys(&:to_sym)
end
user_map
#=> [{:name=>"bob", :password=>"1234"}, {:name=>"alice", :password=>"5678"}]
然后,给定用户的输入:
input_username = 'bob'
input_password = '1234'
检查用户是否存在,以防比较密码:
user = user_map.find { |h| h[:name] == input_username }
#=> {:name=>"bob", :password=>"1234"}
user[:password] == input_password
#=> true
如果Enumerable#find返回非nil
值,请检查密码:用户不存在:
input_username = 'ron'
user = user_map.find { |h| h[:name] == input_username }
user
#=> nil
实现后,您还可以编写:
login_passed = false
CSV.foreach(data_file, headers: true) do |row|
login_passed = row['name'] == input_username && row['password'] == input_password
break if login_passed
end
login_passed
#=> true (or false)