Rails, Cequel - не знаю, как привести к UUID
Я следую этому руководству ( https://medium.com/@olance/rails-4-user-authentication-with-cequel-and-devise-86e1c9ccbcd0), но у меня проблемы с входом в систему. Когда я получаю следующую ошибку:
ArgumentError в HomeController#index
Не знаю, как преобразовать {"n"=>242893962554067921677178635377202198460} в UUID
Извлеченный источник (вокруг строки № 423):
Cql::Uuid.new(value)
else
fail ArgumentError,
"Don't know how to cast #{value.inspect} to a UUID" # Line 423
end
end
Модель, используемая devise:
class User
include Cequel::Record
devise :database_authenticatable, :registerable
key :id, :uuid, auto => true
column :username, :varchar, :index => true
column :name, :varchar
column :lastname, :varchar
column :email, :varchar, :index => true
column :encrypted_password, :varchar
timestamps
end
Если я изменяю ключ на varchar, он работает, но я не хочу использовать UUID, чтобы пользователь мог изменить адрес электронной почты или его имя пользователя.
Как это можно исправить?
1 ответ
Если вы посмотрите в источнике метода uuid
вы увидите здесь:
def uuid(value = nil)
if value.nil?
timeuuid_generator.now
elsif value.is_a?(Time)
timeuuid_generator.at(value)
elsif value.is_a?(DateTime)
timeuuid_generator.at(Time.at(value.to_f))
else
Type::Timeuuid.instance.cast(value)
end
end
Это значит, что у него допустимы такие значения, как nil
, Time
, DateTime
, Ни в одном из них он не будет использовать метод cast
типа::Timeuuid, который находится где-то здесь
Любой из cast
Кажется, определения методов не ожидают получения hash
В качестве обходного пути вы можете попробовать что-то вроде Cql::Uuid.new(value['n'])
Но вы должны проверить, почему вы получили хэш, и что это должно быть на самом деле