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

时间:2013-05-14 16:48:49

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

我有这堂课:

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

有人能告诉我这里缺少什么吗?我希望该字段是可选的。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

我想问题是,如果您将该字段留空,params[:project][:hourly_rate]将为""。如果您执行@project.hourly_rate = "",那么@project.hourly_rate将是0,而不是无。

这是因为"".to_d0。因此,当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