Разработайте поля внутри таблицы паролей - PullRequest
0 голосов
/ 02 декабря 2011

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

InДругими словами, вот ничья моего разыскиваемого дизайна модели:

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

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

1 Ответ

0 голосов
/ 02 декабря 2011

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

Однако я не очень хорошо его протестировал (я только создал пользователя и попытался войти в систему), это может привести к ошибкам и непредвиденному поведению в 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 = "a@b.com"
x.save

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...