我使用Rail的ActiveRecord验证确认来验证ID。我有两个表单字段cbiz_id
和cbiz_id_confirmation
,因此字段会收到完全相同的内容。
cbiz_id
是一个整数,ActiveRecord使cbiz_id_confirmation
成为一个字符串。
有没有办法将cbiz_id_confirmation
验证为整数?
validates :cbiz_id, confirmation: true, presence: { if: :has_any_qapps_role?, notice: I18n.t('messages.updated') }
我尝试了很多事情,例如:
before_validation :change_cbiz_id_confirmation_to_integer
def change_cbiz_id_confirmation_to_integer
:cbiz_id_confirmation.to_i
end
我是Ruby和Rails的新手,所以我们非常感谢基础解释!
答案 0 :(得分:1)
Rails转换cbiz_id
因为它看到DB可以看到该列是一个整数。由于cbiz_id_confirmation
没有列,Rails没有任何类型数据,任何表单提交的默认类型(因为表单编码和查询参数没有类型)是一个字符串。< / p>
您的change_cbiz_id_confirmation_to_string
应该有效,但您在符号上调用了to_i
。您只需cbiz_id_confirmation.to_i
(无前导:
)。此外,也许该方法应以to_integer
结尾。
如果您希望确保cbiz_id_confirmation
是一个甚至超出验证范围的整数,您可以编写一个为您进行转换的setter方法。
attr_reader :cbiz_id_confirmation
def cbiz_id_confirmation=(value)
@cbiz_id_confirmation = Integer(value)
rescue TypeError
@cbiz_id_confirmation = nil
end
如果无法转换该值(例如,Integer(value)
或单词nil
), "ham"
将引发异常,因此rescue
块会使此行为变为Rails并将无效数据视为nil
。您还可以使用value.to_i
来强制nil
和"ham"
0
,或者让异常发生并在其他地方处理问题。
答案 1 :(得分:0)
我用以下代码解决了这个问题:
attr_accessor :current_user_qapps_role, :cbiz_id_confirmation
validates :cbiz_id, confirmation: true, presence:true, if: :has_any_qapps_role?
def cbiz_id_confirmation=(val)
@cbiz_id_confirmation = val.to_i
end
答案 2 :(得分:-2)
您可以轻松创建这样的自定义验证规则,但如果我了解上下文,可能会有一些更优雅的问题解决方案:
validate :cbiz_matches
def cbiz_matches
errors.add(:cbiz_id, "ID's don't match") unless self.cbiz_id.to_i == self.cbiz_id_confirmaton.to_i
end