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

Можно ли легко настроить 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.