1

我有这堂课:

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时,a0再次出现在输入字段中,就像变魔术一样,并且出现验证错误:Hourly rate must be greater than 0

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

谢谢你的帮助!

4

2 回答 2

2

我想问题是,如果您将该字段留空,params[:project][:hourly_rate]将是"". 如果你这样做,@project.hourly_rate = ""那么@project.hourly_rate将是0,而不是零。

这是因为"".to_d0。因此将在is时write_attribute(:hourly_rate_in_cents, number.to_d * 100)写入值。0number""

def hourly_rate=(number)
  hourly_rate_value = number.present? ? number.to_d * 100 : nil
  write_attribute(:hourly_rate_in_cents, hourly_rate_value)
end

应该解决这个问题。

于 2013-05-14T17:00:59.750 回答
0

您的问题是模型中的这种情况:

validates :hourly_rate, :numericality => { :greater_than => 0 }.

您是在告诉它大于 0。提供输入 > 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

于 2013-05-14T18:27:34.937 回答