Можно ли войти через DEVISE, используя виртуальный атрибут и имя пользователя? - PullRequest
0 голосов
/ 16 сентября 2011

У меня многоклиентская CMS. Клиенты имеют много пользователей, и пользователи принадлежат клиенту. Поэтому у модели пользователя есть username и client_id. Имя пользователя уникально в рамках client_id.

Я хочу разрешить устройству devine регистрировать пользователя на основе имени пользователя и client_id, однако, поскольку client_id является возрастающим целым числом, я бы предпочел, чтобы пользователю не нужно было знать его client_id. Скорее он должен просто иметь возможность использовать имя клиента, которое является атрибутом модели клиента.

Я знаю, что могу создать метод client_handle следующим образом:

class User
   def client_handle
      self.client.handle
   end
end

есть ли способ настроить devise для входа в систему с помощью [: username,: client_handle]?

1 Ответ

0 голосов
/ 16 сентября 2011

Создать виртуальный атрибут client_name в Users:

  1. Добавить client_name как attr_accessor:

    attr_accessor: client_name

  2. Добавить client_name к attr_accessible:

    attr_accessible: client_name

Скажите Devise для использования: client_name в аутентификационных ключах Измените config / initializer / devise.rb, чтобы иметь:

 config.authentication_keys = [ :email, :client_name ]

Перезаписать Devise метод find_for_database_authentication в Users

Для ActiveRecord:

 protected

 def self.find_for_database_authentication(warden_conditions)
   conditions = warden_conditions.dup
   client_name = conditions.delete(:client_name)
   email = conditions.delete(:email)
   where(conditions).where(["lower(email) = :value", { :value => email.downcase }]).where(["'user'.'client_id' in (select 'id' from 'clients' where 'clients'.'name' = :value)", {:value => client_name}]).first
 end

И последний шаг - добавление поля client_name в представления:

Убедитесь, что в вашем проекте есть представления Devise, чтобы вы могли настроить их

Рельсы 3:

rails g devise:views

Изменить вид сессий / new.html.erb:

  <p><%= f.label :email %><br />
  <%= f.email_field :email %></p>
+  <p><%= f.label :client_name %><br />
+  <%= f.text_field :client_name %></p>

* PS: вместо вашего метода client_handle используйте *

delegate :handle, :to => :client, :prefix => true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...