Создать виртуальный атрибут client_name
в Users:
Добавить client_name
как attr_accessor:
attr_accessor: client_name
Добавить 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