Rails Devise gem - настройка модели пользователя по умолчанию путем разделения ее на другие модели - PullRequest
4 голосов
/ 11 декабря 2011

Я попробовал драгоценный камень devise rails, и мне было интересно, как лучше распределить атрибуты модели пользователя, которые он создает, по нескольким моделям.

На данный момент моя пользовательская модель выглядит следующим образом, что является поведением устройства по умолчанию:

Пользователь (id: целое число, электронная почта: строка, encrypted_password: строка, password_salt: string, reset_password_token: string, запомнить_token: строка, Remember_created_at: datetime, sign_in_count: целое число, current_sign_in_at: datetime, last_sign_in_at: datetime, current_sign_in_ip: строка, last_sign_in_ip: строка, созданная_: datetime, updated_at: datetime)

Я хотел бы иметь некоторые атрибуты ниже в другой модели, например, Watchdog

sign_in_count, current_sign_in_at, last_sign_in_at, current_sign_in_ip, last_sign_in_ip

Я думал о простом делегировании их с помощью метода делегата:

delegate :sign_in_count, :sign_in_count=, ..., :to => :watchdog

Было бы интересно узнать о лучших решениях этой проблемы.

Спасибо

Sergio

1 Ответ

2 голосов
/ 13 декабря 2011

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

    module Trackable
      def update_tracked_fields!(request)
        old_current, new_current = watchdog.current_sign_in_at, Time.now.utc
        watchdog.last_sign_in_at     = old_current || new_current
        watchdog.current_sign_in_at  = new_current

        old_current, new_current = self.current_sign_in_ip, request.ip
        watchdog.last_sign_in_ip     = old_current || new_current
        watchdog.current_sign_in_ip  = new_current

        watchdog.sign_in_count ||= 0
        watchdog.sign_in_count += 1

        watchdog.save(:validate => false)
      end
    end

Но не забудьте поставить record.update_tracked_fields!(warden.request) на блок Warden::Manager.after_set_user, как мы делаем на Разработать хук .

...