如何迭代行并在Sinatra中打印出CSV :: Table值

时间:2016-10-22 01:24:53

标签: ruby loops csv object 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文件中打印姓名和电话号码。

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

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 %>

现在我正在努力克服我对使用物体和散列的恐惧,所以我正在接近这样的问题:

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

我知道使用带有标头的CSV :: Table对象的好处意味着我可以像这样访问值:

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

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

我尝试在erb文件中编写while循环 - 失败。另外我理解的foreach循环是CSV方法并相应地修改了我的代码 - 失败。

我无法迭代行并调用特定键。

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

任何建议都将不胜感激。

我一直在研究这个问题几个小时:(

1 个答案:

答案 0 :(得分:1)

代码很好。如下所示:

> 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']