Rails 3.0.3应用程序。 。
我在模型中使用虚拟属性来转换存储在数据库中的值,以便根据用户的偏好(美国或公制单位)进行显示。我正在读取方法中进行转换,但是当我测试我的状态验证时,我得到NoMethodError,因为真实属性是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,我应该扔掉一个吗?检查读者?或者我应该在其他地方执行此转换? (如果是的话,在哪里?)
谢谢!
答案 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
方法将美国单位转换为指标。我希望以相同的单位一致地存储值,因此如果用户稍后更改其偏好,则先前存储的值不会变为无效。