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