3

内部に配列を含むハッシュを作成しようとしています:

# create new hash to store customers and their projects
@customers = Hash.new

# get all customers from Mite
Mite::Customer.all.each do |customer|
  @customers[customer.id] = {:name => customer.name, :projects => []}
end

# get all projects from Mite and store them in the :projects array
Mite::Project.all.each do |project|
  @customers[project.customer_id][:projects] << project # line 17
end

Mite::Project.allおよびMite::Customer.all外部 API (mite.yo.lk) のメソッドです。それらは機能し、データが返されるので、それは失敗ではありません。

残念ながら、API には顧客 ID でプロジェクトをフィルター処理する方法がないため、この方法を使用する必要があります。

それがエラーメッセージです:

undefined method `[]' for nil:NilClass

app/controllers/dashboard_controller.rb:17:in `block in index'
app/controllers/dashboard_controller.rb:16:in `each'
app/controllers/dashboard_controller.rb:16:in `index'

ここで何が悪いのかわかりませんか?

4

2 に答える 2

3

@thorstenmüllerが言ったことは正しいです。プロジェクトに古い顧客への参照が含まれているように見えますか?

論理エラーが発生しないという条件で、防御コーディングをお勧めします。何かのようなもの:

# get all projects from Mite and store them in the :projects array
Mite::Project.all.each do |project|
  if @customers[project.customer_id].present?
    @customers[project.customer_id] << project
  end
end

繰り返しますが、古い顧客がデータベースで受け入れられる場合にのみ、これをお勧めします。

もう 1 つ注意すべき点は、project.customer_id が一貫した型 (つまり、常に整数または文字列) であることです。

# get all customers from Mite
Mite::Customer.all.each do |customer|
  @customers[customer.id.to_i] = {:name => customer.name, :projects => []}
end

# get all projects from Mite and store them in the :projects array
Mite::Project.all.each do |project|
  @customers[project.customer_id.to_i][:projects] << project # line 17
end

私は個人的にこれに何度も巻き込まれました。

HTHと最高。

于 2013-01-24T13:40:34.453 に答える
1

顧客が定義されていないことが受け入れられない場合は、より具体的なエラーを発生させることができます。これにより、どの顧客が欠落しているかがわかります。

Mite::Project.all.each do |project|
  begin
    @customers[project.customer_id].fetch(:projects) << project
  rescue IndexError => error
    raise(error.class, "customer missing: #{project.customer_id}", error.backtrace)
  end
end

別の方法は、エラーを再度発生させる代わりに、顧客を作成することです。

于 2013-01-24T13:51:13.473 に答える