Rails:虚拟属性读取器在验证期间导致错误

时间:2012-01-11 16:05:45

标签: ruby-on-rails ruby-on-rails-3

Rails 3.0.3应用程序。 。

我在模型中使用虚拟属性来转换存储在数据库中的值,以便根据用户的偏好(美国或公制单位)进行显示。我正在读取方法中进行转换,但是当我测试我的状态验证时,我得到NoM​​ethodError,因为真实属性是nil。这是代码:

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为零,但处理这个问题的最佳方法是什么?除非self.weight_entry.nil,我应该扔掉一个吗?检查读者?或者我应该在其他地方执行此转换? (如果是的话,在哪里?)

谢谢!

1 个答案:

答案 0 :(得分: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方法将美国单位转换为指标。我希望以相同的单位一致地存储值,因此如果用户稍后更改其偏好,则先前存储的值不会变为无效。