Да, есть обходной путь, который заключается в переопределении внутренних методов Devise (что не рекомендуется).
Однако я не очень хорошо его протестировал (я только создал пользователя и попытался войти в систему), это может привести к ошибкам и непредвиденному поведению в Devise.Поэтому, пожалуйста, убедитесь, что ваше приложение хорошо протестировано, прежде чем этот код будет отправлен в производство.
Решение для модуля проверки подлинности базы данных состоит в следующем:
Запись миграции
class DeviseCreateUsers < ActiveRecord::Migration
def change
create_table(:users) do |t|
t.string :email
t.timestamps
end
create_table :passwords, :force => true do |t|
t.integer :user_id
t.string :encrypted_password, :null => false, :default => ""
end
end
end
создать delegate
это указывает на password_record#encrypted_password
.
- добавить
accepts_nested_attributes_for
к password_record
- создать установщик для атрибута
encrypted_password
(Devise использует это)
Ваши модели должныбыть таким:
class User < ActiveRecord::Base
devise :database_authenticatable
has_one :password_record, :class_name => "Password", :foreign_key => "user_id"
delegate :encrypted_password, :to => :password_record
accepts_nested_attributes_for :password_record
def encrypted_password=(encrypted_password)
self.password_record.encrypted_password = encrypted_password
end
attr_accessible :email, :password, :password_confirmation, :remember_me
end
class Password < ActiveRecord::Base
belongs_to :user
end
Я создал пользователя, используя это:
x = User.new
x.password_record = Password.new
x.password = "123456"
x.email = "a@b.com"
x.save
Я протестировал действие sign_in
, и оно заработало.
Вы можете создать с помощью формы sign_up с вложенными атрибутами .Чтобы проверить, как сделать то же самое для других модулей, взгляните на исходный код Devise () и посмотрите, какие атрибуты он использует и как он работает (https://github.com/plataformatec/devise/tree/master/lib/devise/models).