我有这堂课:
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
有人能告诉我这里缺少什么吗?我希望该字段是可选的。
感谢您的帮助!
答案 0 :(得分:2)
我想问题是,如果您将该字段留空,params[:project][:hourly_rate]
将为""
。如果您执行@project.hourly_rate = ""
,那么@project.hourly_rate
将是0
,而不是无。
这是因为"".to_d
是0
。因此,当write_attribute(:hourly_rate_in_cents, number.to_d * 100)
为0
时,number
会写出值""
。
def hourly_rate=(number)
hourly_rate_value = number.present? ? number.to_d * 100 : nil
write_attribute(:hourly_rate_in_cents, hourly_rate_value)
end
应该解决这个问题。
答案 1 :(得分:0)
您的问题出现在您的模型中:
validates :hourly_rate, :numericality => { :greater_than => 0 }.
你告诉它大于0。 提供输入&gt; 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