我有这样一个类:
class Project < ActiveRecord::Base
attr_accessible :hourly_rate
validates :hourly_rate, :numericality => { :greater_than => 0 },
:allow_blank => true,
:allow_nil => true
def hourly_rate
read_attribute(:hourly_rate_in_cents) / 100
end
def hourly_rate=(number)
write_attribute(:hourly_rate_in_cents, number.to_d * 100)
end
end
问题是我的setter方法没有按照我想要的方式运行。
在我的表单中,当我将hourly_rate
输入字段留空然后点击Update
时,0
再次出现在输入字段中,就像魔术一样,并且我得到验证错误:Hourly rate must be greater than 0
谢谢你的帮助!
我想问题是,如果您将字段留空,params[:project][:hourly_rate]
将是""
。如果执行@project.hourly_rate = ""
,则@project.hourly_rate
将是0
,而不是nil。
这是因为"".to_d
是0
。因此,当number
为""
时,write_attribute(:hourly_rate_in_cents, number.to_d * 100)
将写入值0
。
def hourly_rate=(number)
hourly_rate_value = number.present? ? number.to_d * 100 : nil
write_attribute(:hourly_rate_in_cents, hourly_rate_value)
end
您的问题是模型中的条件:
validates :hourly_rate, :numericality => { :greater_than => 0 }.
你让它大于0。要么提供input> 0,要么在该行前加上"#"注释掉。
当您第一次执行迁移时,它将这些条件放进去,所以现在撤消它,如下所示。
rails g migration remove_numericality_from_hourly_rate
然后在您的迁移文件中:
class RemoveNumericallityFromHourlyRate < ActiveRecord::Migration
def self.up
change_column :my_table, :hourly_rate, :string
end
end
然后运行以下命令:执行rake db:migrate