我正在创建一个简单的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方法并相应地修改了我的代码 - 失败。
我无法迭代行并调用特定键。
我不确定我是否使用了正确的循环。
任何建议都将不胜感激。
我一直在研究这个问题几个小时:(
答案 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']