Создание полей в таблице паролей

Можно ли легко настроить Devise gem с каждым из своих полей внутри таблицы паролей, которая сопоставляется с моделью паролей, принадлежащей модели пользователя (имеющей только поле email)?

Другими словами, вот черта моего желаемого дизайна модели:

+-------+
 | User |
 +-------+
 | email |
 +-------+
 ^ (have one)
 |
 | (belongs to)
+------------------------+
| Password |
+------------------------+
| encrypted_password |
| reset_password_token |
| reset_password_sent_at |
| sign_in_count |
| ... |
+------------------------+

Вики-разработчик очень полный, но информации об этом нет.

1 ответ

Да, есть обходное решение, которое заключается в переопределении внутренних методов разработки (что не рекомендуется).

Тем не менее, я не тестировал его хорошо (я только создал пользователя и пытался войти в систему), это может привести к некоторым ошибкам и непредвиденному поведению в Devise. Поэтому, пожалуйста, убедитесь, что ваше приложение хорошо протестировано, прежде чем этот код будет отправлен на производство.

Решение для аутентифицируемого модуля базы данных состоит в следующем:

  1. Напишите миграцию

    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
  2. создайте delegate который указывает на password_record#encrypted_password.

  3. добавить accepts_nested_attributes_for в password_record
  4. создайте сеттер для атрибута 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 = "[removed_email]"
x.save

Я протестировал действие sign_in и он сработал.

Вы можете создать форму sign_up с вложенными атрибутами. Чтобы проверить, как делать то же самое для других модулей, посмотрите исходный код Devise() и посмотрите, какие атрибуты он использует и как он работает (https://github.com/plataformatec/devise/tree/master/lib/devise/models).

licensed under cc by-sa 3.0 with attribution.