Как сказал Фредерик выше, проблема заключается в сравнении экземпляра String с экземпляром Integer.
Скорее всего, вот что у вас есть в вашем контроллере:
Thing.new(params[:thing]) # note all these params come in as a string
Что происходит, так как #pin является целочисленным столбцом, вы получите следующее поведение:
my_thing = Thing.new
my_thing.pin = "123456"
my_thing.pin # Will be the integer 123456, the attribute has been auto-cast for you
Но поскольку #pin_confirmed является обычным атрибутом, а не целочисленным столбцом, вот странность, которую вы увидите:
my_thing = Thing.new
my_thing.pin_confirmation = "123456"
my_thing.pin_confirmation # Will be the *string* "123456", the attribute has been set as is
Естественно, в этом случае, независимо от того, какие значения у вас есть, так как они входят через хэш «params» (который всегда является набором строк), вы в конечном итоге назначите строковые значения для обоих атрибутов, но они будет приведен к разным типам.
Есть несколько способов исправить это.
Во-первых, вы можете создать #pin_confirmation в виде целочисленного столбца в базе данных.
Во-вторых, вы можете добавить установщик атрибутов для #pin_confirmation следующей формы:
def pin_confirmation=(val)
@pin_confirmation = val.to_i
end