2012-01-11 11 views
0

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を除いてちょうど投げるべきですか?読者をチェックインする?あるいは、私はこの変換をどこか別の場所で行うべきですか? (はいの場合は?)

ありがとう!

+0

同じ名前(converted_weight)と異なる入力パラメータ(「メソッドオーバーロード」)の2つのメソッドを使用することは間違いありませんか? –

+0

私が理解しているものは、ゲッターとセッターメソッドです。 Railsの限られた理解から、私のセッターはおそらく必要ないでしょう(Railsはattr_accessorヘルパー経由でこれを処理します)。私がしなければならないことは、メトリック値(kg)から米国単位(lbs)に値を変換することです。私の最初の推測は、仮想属性のgetterメソッドでこれを行うことでしたが、まだweight_entry値がないため、仮想属性の存在をテストするときに検証中に爆発しています。少なくとも私はそれが起こっていると思います。 – jacoulter

+0

私は 'converted_weight'の命名に混乱していると思います。フォームコードを表示できますか? 'weight_entry'はフォームによって渡され、データベースに格納されるべきですか? –

答えて

0

は、ここで私がやったものだ:

モデル

validates :weight_entry, :numericality => {:greater_than_or_equal_to => 0.1} 

before_save :convert_weight 

attr_reader :converted_weight 

def converted_weight 
    unless self.user.nil? 
    unless self.weight_entry.nil? 
     if self.user.miles? 
     return (self.weight_entry * 2.2).round(1) 
     else 
     return self.weight_entry 
     end 
    end 
    else 
    return nil 
    end 
end 

フォーム

<%= f.label :weight_entry, 'Weight' %><br /> 
<%= f.text_field :weight_entry, :size => 8, :value => @weight.converted_weight %> <strong><%= weight_units %></strong> (<em>Is this not right? Go to your <%= link_to 'profile', edit_user_registration_path %> to change it</em>) 

unless.self.weight_entry.nil?チェックはそれが仕事だ行うに検証することができます。誰かがこれを行うためのよりよい方法を知っているなら、私は示唆に開放されています。

ありがとうございます!

P.S. before_save convert_weightメソッドは、米国単位をメトリックに変換します。私は同じ単位で値を一貫して保存したいので、ユーザーが自分の好みを変更した場合、以前に保存した値が無効にならないようにします。

関連する問題