如何有效输入以匹配 CSV 文件中的数据

How to valid input to matches data in CSV file

我使用的是 Ruby 2.7 以上版本。我一直在完成这项任务并且还在学习。我很确定我没有使用正确的代码。这个任务要求我做一个模拟 atm 程序。要求之一是我需要在用户访问程序之前检查用户有效输入是否与 CSV.file 中的数据匹配。

我正在使用 ruby(不允许使用 rails 或任何高级 ruby 代码)。我在任何地方搜索类似程序以供参考,但大多不涉及 CSV 文件。如何检查用户的输入是否有效并与 CSV 文件匹配?我在如何进行验证以及如何使用两个输入(用户名和密码)进行验证时遇到问题。这个程序在命令行上是 运行。如果我不够清楚,我深表歉意。你能从我的代码中告诉我哪里出错了吗?

我有三个 .rb 文件和两个 csv 文件。我不确定是否应该创建两个单独的 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 and 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 returns 非 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)