Ruby 关于 Rails 未定义的方法 `delete_at' for "John":String

Ruby on Rails undefined method `delete_at' for "John":String

我正在尝试用一组名称替换数据库中的一列名称。 我是 rails 上 Ruby 的新手,所以它可能很简单。

这很好用:

<% students = %w(John Paul Ringo George) %>
<% teams = RoundRobinTournament.schedule(students) %>
<td><%= teams %></td>

这是一个错误:

<% @players.each do |player| %>
<% students = player.first_name %>
<% teams = RoundRobinTournament.schedule(students) %>
<td><%= teams %></td>

错误:

undefined method `delete_at' for "John":String
Did you mean?  delete
               delete!

RoundRobinModule中的“delete_at”是什么原因导致的错误:

require 'round_robin_tournament/version'

module RoundRobinTournament
   def self.schedule(array)
     array.push(nil) if array.size.odd?
     n = array.size
     1.step(n / 2, 1).each do |i|
       array.insert(n - i, array.delete_at(i))
     end
     pivot = array.pop
     games = (n - 1).times.map do
       day = [[array.first, pivot]] + (1...(n / 2)).map { |j| [array[j], array[n - 1 - j]] }
       array.rotate!
       day
     end
     array.push pivot unless pivot.nil?
     games
  end
 end

students 应该是一个数组,但 students = player.first_name 使它成为一个字符串。

我不知道这是否是您想要的,但以下应该有效:

<% students = @players.pluck(:first_name) %> # or @players.map(&:first_name)
<% teams = RoundRobinTournament.schedule(students) %>
<td><%= teams %></td>

如果 @players 包含 ActiveRecord::Relation,则使用 .pluck;如果它是 Player 个对象的数组,则使用 .map

但是,错误会准确告诉您问题出在哪里。你只需要注意。该代码本来会更早崩溃,但 StringArray 都响应 .size