Ruby on Rails调用RoundRobinTournament.schedule报String无delete_at方法错误
问题根因
RoundRobinTournament.schedule 方法要求传入的参数是包含所有参赛选手的数组,你第一段可正常运行的代码中,%w(John Paul Ringo George) 就是符合要求的字符串数组。
你第二段报错的代码中,将单个选手的姓名字符串 player.first_name 直接传入了方法,字符串没有数组的 delete_at 方法,因此触发报错。
修复方案
你逻辑上的错误是把「生成所有选手赛程」的方法放到了单个选手的遍历循环里,正确的写法应该是先把所有选手的姓名收集为数组,再调用赛程生成方法:
<%# 先收集所有参赛选手的姓名为数组 %> <% students = @players.map(&:first_name) %> <%# 生成赛程 %> <% teams = RoundRobinTournament.schedule(students) %> <%# 遍历渲染赛程即可,示例按天渲染对阵 %> <% teams.each do |daily_matches| %> <tr> <% daily_matches.each do |match| %> <td><%= "#{match[0]} VS #{match[1]}" %></td> <% end %> </tr> <% end %>
额外注意事项
- 该方法内部使用了
delete_at、rotate!等原地修改数组的方法,如果你后续还需要使用原始的选手姓名数组,传入参数时调用dup传副本即可,避免原数组被篡改:<% teams = RoundRobinTournament.schedule(students.dup) %> - 循环赛至少需要2名参赛选手才可生成有效赛程,建议调用方法前先判断
students的长度,避免极端场景下的异常。
内容的提问来源于stack exchange,提问作者Otto Heij
相关产品推荐
相关产品推荐

