自定义 setter 方法不接受 Ruby on Rails 中的空白值?



我有这样一个类:

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_d0。因此,当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

最新更新