我有模型“人类”,这个模型有整数属性:年龄。
例如,我对这个整数属性:age使用验证。
当我添加具有错误值的新 ' Human ' :age(例如"2aaa3")时,它会使我返回错误,但它也会被削减 :age 像"2"。但我不想要它。我想留下最后一个错误的值"2aaa3"。
所以,问题是“我该怎么做?”
我有模型“人类”,这个模型有整数属性:年龄。
例如,我对这个整数属性:age使用验证。
当我添加具有错误值的新 ' Human ' :age(例如"2aaa3")时,它会使我返回错误,但它也会被削减 :age 像"2"。但我不想要它。我想留下最后一个错误的值"2aaa3"。
所以,问题是“我该怎么做?”
大家好,对我的问题感兴趣的人。
我很高兴地说我自己创建了解决方案。但我对此有几点意见。))
首先,解决方案是:
class ApplicationController < ActionController::Base
...
...
after_filter :restore_int_value, :only => [:create, :update]
...
...
private
...
...
def restore_int_value
response.body = response.body.gsub(/(numeric.*<input id=")([^_]*)(_)([^"]*)(.*value=")(\d+)(")/){$1 + $2 + $3 + $4 + $5 + params[$2][$4] + $7}
end
...
...
end
二、备注:
1) 该解决方案适用于“Formtastic”和“Simple_form”等宝石。这些 gems 构建了包含在详细 html 中的表单,并为我们提供了使用正则表达式的可能性。如果您不使用此类 gem,则可以将所有整数属性包装起来,例如,在带有 'numeric' 类的 'p' 标签中,如下所示,我认为我的解决方案也适用于此:
<p class="numeric"> <%= text_field(:human, :age) %> </p>
2)我认为我的解决方案不适用于多模型形式的嵌套模型的整数字段。(Ryan Bates 在“Advanced Rails Recipes”的“Handle Multiple Models in One Form”中描述了这种工作)。但是,如果您阅读 Ryan Bates 的文章,您会发现他已经在使用 JavaScript。因此,以您需要 JavaScript 的形式使用嵌套模型。然后你也可以使用 JavaScript 进行验证(正如 Kunday 所说)。你不会有问题。;) 但是,如果您在表单中有静态数量的嵌套模型并且不使用 JavaScript,那么我认为您可以根据需要创建新的特定正则表达式(类似于我创建的那个)。我希望你能解决这个问题。;)
我希望我已经涵盖了您可能遇到此类问题的所有场景,并且我的解决方案将对除我之外的其他人有用。;)
这是 Rails 中验证的默认行为。不确定是否有其他方法可以覆盖它。但是,您可以使用 javascript 进行验证,这将比使用 validates_numericality_of 更注重用户体验。