Rails 3.0.3アプリケーション。 。 。Rails:検証中に仮想属性リーダーがエラーを引き起こす
私は、モデル内の仮想属性を使用して、データベースに格納された値をユーザーの嗜好(米国単位またはメートル法単位)に基づいて表示します。私は読者メソッドで変換を行っていますが、実際の属性がnilであるため、私は自分の存在の検証をテストするときにNoMethodErrorを取得します。
class Weight < ActiveRecord::Base
belongs_to :user
validates :converted_weight, :numericality => {:greater_than_or_equal_to => 0.1}
before_save :convert_weight
attr_accessor :converted_weight
def converted_weight(attr)
self.weight_entry = attr
end
def converted_weight
unless self.user.nil?
if self.user.miles?
return (self.weight_entry * 2.2).round(1)
else
return self.weight_entry
end
else
return nil
end
end
...
これが問題を引き起こしている行がある:ここでは、コードです
return (self.weight_entry * 2.2).round(1)
私はself.weight_entryがnilである理由を理解し、これを処理するための最良の方法は何ですか?私はself.weight_entry.nilを除いてちょうど投げるべきですか?読者をチェックインする?あるいは、私はこの変換をどこか別の場所で行うべきですか? (はいの場合は?)
ありがとう!
同じ名前(converted_weight)と異なる入力パラメータ(「メソッドオーバーロード」)の2つのメソッドを使用することは間違いありませんか? –
私が理解しているものは、ゲッターとセッターメソッドです。 Railsの限られた理解から、私のセッターはおそらく必要ないでしょう(Railsはattr_accessorヘルパー経由でこれを処理します)。私がしなければならないことは、メトリック値(kg)から米国単位(lbs)に値を変換することです。私の最初の推測は、仮想属性のgetterメソッドでこれを行うことでしたが、まだweight_entry値がないため、仮想属性の存在をテストするときに検証中に爆発しています。少なくとも私はそれが起こっていると思います。 – jacoulter
私は 'converted_weight'の命名に混乱していると思います。フォームコードを表示できますか? 'weight_entry'はフォームによって渡され、データベースに格納されるべきですか? –