Ruby on rails 自定义设置器方法赢得';在RubyonRails中不接受空白值?

Ruby on rails 自定义设置器方法赢得';在RubyonRails中不接受空白值?,ruby-on-rails,ruby,ruby-on-rails-3,ruby-on-rails-3.2,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 => tru

我有这门课:

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
class项目{:大于=>0},
:allow_blank=>true,
:allow_nil=>true
def小时费率
读取属性(:小时费率(单位:美分)/100
结束
def小时费率=(数字)
写入属性(:小时费率,单位为美分,数字为100)
结束
结束
问题是我的setter方法没有按照我想要的方式运行

在我的表单中,当我将
小时费率
输入字段留空,然后点击
更新
时,输入字段中再次出现一个
0
,就像魔术一样,我得到一个验证错误:
小时费率必须大于0

有人能告诉我我错过了什么吗?我希望该字段是可选的


谢谢你的帮助

我想问题是,如果您将字段留空,
参数[:project][:hourry\u rate]
将是
“”
。如果您执行
@project.hourly_rate=“
,则
@project.hourly_rate
将为
0
,而不是零

这是因为
”。to_d
0
。因此,
write\u属性(:小时费率,单位为美分,number.to\u d*100)
将在
number
时写入值
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
class removenumericalityfromrhourlyrate
然后运行以下命令:
运行rake db:migrate

您可以共享视图代码吗??模型没有给出足够的线索。嗯,奇怪。当我添加该行,然后尝试保存一个空白的
hourly_rate
字段时,会显示上一个值,例如“50”。我肯定错过了一些非常基本的东西。我没有正确理解您的用例,我已经更新了我的答案。就是这样。谢谢!尽管作为Rails n00b,我不得不读了好几遍,但你给出的描述确实很准确。我只是想知道为什么我以前从未遇到过这样的代码片段。。。这个用例实际上非常简单:从用户那里获取一个十进制数,然后将其作为整数保存到数据库中。显然,在处理货币值以避免浮点错误时,这是很常见的。遗憾的是,我有一大堆像上面那样的setter方法。我真的不想把那一行代码添加到所有这些代码中。难道没有捷径吗?不,肯定不是那条线引起的麻烦。我只是把它注释掉了,没有任何改变。问题一定是我的getter和setter方法。当你注释掉它时,你必须重新加载你的应用程序。我想这是你的问题。让我们确认一下:这样做:rake db:schema:dump,然后发布以下结果:cat db/schema.rb
class RemoveNumericallityFromHourlyRate < ActiveRecord::Migration
  def self.up

 change_column :my_table, :hourly_rate, :string 
 end   
end