答案 0 :(得分:3)
如果您100%确定csv中的引脚是唯一的,您可以试试这个
def customer_check(user_pin)
user = CSV.read('customers.csv', headers: true).detect { |row|
row['pin'] == user_pin && row['work_here'] == "YES"
}
if user
puts "Welcome back #{user['first_name']}."
sleep(1.5)
else
puts "login failed. Please try again in 3 seconds..."
sleep(3.0)
login_start
end
navigation_menu
end
变量user
将被初始化为条件为真的.csv的相应行。否则它的值将为零:
根据{{3}}的
detect
方法:将 enum 中的每个条目传递给阻止。返回块不为false的第一个。如果没有对象匹配,则调用 ifnone 并在指定时返回其结果,否则返回 nil 。
如果没有给出阻止,则返回枚举器。
请注意,您可能必须确保row['pin']
与user_id
数据类型匹配,因为它可能以字符串形式出现,在这种情况下您必须row['pin'].to_i == user_pin
答案 1 :(得分:1)
如果boolean语句返回true,如何让语句从CSV中返回同一行(标题为'first_name')的值?
按原样运行代码,Ruby期望最终“结束”并引发此错误:
syntax error, unexpected end-of-input, expecting keyword_end
在代码中添加另一个结尾'end'将导致if x == true
块被评估,但是,请注意以下代码中的缩进可以说更清晰。使用this example .csv file,如果Welcome back...
,此代码将打印return
和x == true
名字:
require 'csv'
def customer_check(user_pin)
x = false
CSV.read('customers.csv', headers: true).any? do |row|
x = true if row['customerNo'] == user_pin && row['lastName'] == "Dunbar"
yellow = row['firstName']
# The if/else clauses are indented within the CSV.read
if x # <-- "== true" is redundant
# puts "Welcome back #{yellow}." # you can lose "yellow" if you want to
puts "Welcome back #{row['firstName']}."
sleep(1.5)
# return yellow # <-- RETURN VALUE
return row['firstName'] # <-- RETURN VALUE
else
puts "login failed. Please try again in 3 seconds..."
sleep(3.0)
# login_start
end
# navigation_menu
end
end
return_name = customer_check('1') # <-- prints "Welcome back John"
puts return_name # <-- "John" is the RETURN VALUE
我不确定您是如何使用login_start
或navigation_menu
但我希望这有助于回答您的问题。如果有帮助,这是CSV doc