0

「レポート」に追加された「値」の合計がカテゴリ(動作)ごとに特定の値(600)になることを確認するカスタムバリデーターを作成しようとしています。私のコードは次のとおりです。

報告する:

class Report < ActiveRecord::Base
  attr_accessible :value_ids, :values_attributes
  accepts_nested_attributes_for :values

  validate :validates_behaviour_sums

  def values_by_behaviour
    hash_hash = Hash.new( 0 ) 
    values.each do |v|
      au_hash = hash_hash[ v.behaviour ] 
        if au_hash.nil
        au_hash = Hash.new( 0 )
      end
      au_hash.store( v.assessed_user, v )
      hash_hash.store( v.behaviour, au_hash )
    end
  end


  def validates_behaviour_sums
    sums_valid = true
    self.values_by_behaviour.each do |behaviour_values|
      unless behaviour_values.values.sum == 600
        sums_valid = false
      end
    end
    unless sums_valid
      errors.add(:values, "The behaviours in each category must equal 600." )
    end
  end
end

価値:

class Value < ActiveRecord::Base
  attr_accessible :value, :assessed_user_id, :behaviour_id

  belongs_to :assessed_user, :class_name => "User"
  belongs_to :behaviour

  belongs_to :report

  validates :value, :assessed_user_id, :behaviour_id, :presence => true
end

このコードを実行しようとすると、次のエラーが発生します。

ReportsController#createのNoMethodError

0:Fixnumの未定義のメソッド `nil'

Rails.root: /Users/micah/dev/rails_projects/s2

アプリケーショントレース

app/models/report.rb:23:in `block in values_by_behaviour'
app/models/report.rb:18:in `values_by_behaviour'
app/models/report.rb:45:in `validates_behaviour_sums'
app/controllers/reports_controller.rb:35:in `create'

コレクション「values」はまだ設定されていないようですが、他に検証する方法がわかりません。値を受け入れ、適切に設定します。

4

1 に答える 1

0

現在の間違いは、0:Fixnumの未定義のメソッドnilです。au_hash.nil?nilをチェックする場合は、の代わりに書き込む必要がau_hash.nilあります。ゼロをチェックする場合は、を使用する必要があります。au_hash.zero?

于 2012-09-04T09:34:41.253 に答える