验证确认 - 将确认从字符串更改为整数

时间:2015-12-07 21:55:15

标签: ruby-on-rails ruby validation activerecord

我使用Rail的ActiveRecord验证确认来验证ID。我有两个表单字段cbiz_idcbiz_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的新手,所以我们非常感谢基础解释!

3 个答案:

答案 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