我有用户输入的表单字段:
50.5%
$144.99
Wednesday, Jan 12th, 2010
...
percent
和 money
类型属性保存为 decimal
带有 ActiveRecord 的字段,日期为 datetime
或 date
字段。javascript中格式之间的转换很容易,理论上可以转换成activerecord可接受的格式
onsubmit
,但这不是一个体面的解决方案。我想做一些覆盖 ActiveRecord 中的访问器的事情,所以当它们被设置时,它会将它们从任何字符串转换为适当的格式,但这也不是最好的。
我不想要的是必须通过一个单独的处理器对象来运行它们,这需要在 Controller 中执行类似的操作:
def create
# params == {:product => {:price => "$144.99", :date => "Wednesday, Jan 12, 2011", :percent => "12.9%"}}
formatted_params = Product.format_params(params[:product])
# format_params == {:product => {:price => 144.99, :date => Wed, 12 Jan 2011, :percent => 12.90}}
@product = Product.new(format_params)
@product.save
# ...
end
我希望它完全透明。 ActiveRecord 中的钩子(Hook)在哪里,所以我可以用 Rails 方式做到这一点?
更新
我现在只是这样做:https://gist.github.com/727494
class Product < ActiveRecord::Base
format :price, :except => /\$/
end
product = Product.new(:price => "$199.99")
product.price #=> #<BigDecimal:10b001ef8,'0.19999E3',18(18)>
最佳答案
您可以使用验证前 Hook 来规范化您的参数,例如 before_validation
class Product < ActiveRecord::Base
before_validation :format_params
.....
def format_params
self.price = price.gsub(/[^0-9\.]/, "")
....
end
关于ruby-on-rails - rails 方式 : Formatting Value Before Setting it in the Model?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4349254/