如何遍历行并在 Sinatra 中打印出 CSV::Table 值

How to iterate over rows and print out CSV::Table values in Sinatra

我正在制作一个简单的 Sinatra 应用程序并具有以下 'numbers.csv' 文件:

Name,Title,Phone
Ally Smith,Manager,888-552-444
Rick Jones,Director,888-552-447
Hayley Bowman,Accountant,888-552-424

任务是在 erb 文件中打印姓名和 phone 号码。

我最初用嵌套数组解决了这个问题:

get '/' do
  # turns CSV into array with nested arrays
  @names = CSV.read('names.csv')
  # delete headers
  @names.shift
  erb :index
end

和每个循环:

  <tr>
    <th>Name</th>
    <th>Number</th>
  </tr>

  <% @names.each do |row| %>
  <tr>
    <td> <%= row[0] %> </td>
    <td> <%= row[2] %> </td>
  <tr>
  <% end %>

现在我正在努力克服对使用 objects 和哈希的恐惧,所以我是这样处理问题的:

get '/' do
  # turns CSV into object with key value pairs
  @numbers = CSV.read('numbers.csv', headers:true)
  erb :index
end

我知道使用 CSV::Table object 和 headers 的好处意味着我可以像这样访问值:

@names[i]["Name"]
@names[i]["Phone"]

其中 i 是每行的计数器,后跟键名。

我尝试在 erb 文件中写一个 while 循环——失败了。我理解的 foreach 循环也是 CSV 方法并相应地修改了我的代码 – 失败。

我在遍历行和调用特定键时遇到问题。

我不确定我是否使用了正确的循环。

如有任何建议,我们将不胜感激。

我已经为此工作了几个小时:(

代码没问题。如下所示:

> numbers = CSV.read('numbers.csv', headers:true)
> numbers.each do |row|
>     puts "#{row['Name']} - #{row['Phone']}"
>   end

Ally Smith - 888-552-444
Rick Jones - 888-552-447
Hayley Bowman - 888-552-424

我认为你的问题是你的变量。您应该在第二个示例中使用 @numbers 而不是 @names

@names[i]["Name"] # should be @numbers[i]['Name']