Rails 3 + Devise 1.3.4: Как войти под именем пользователя? - PullRequest
2 голосов
/ 16 июня 2011

Я знаю, что уже есть тонны учебников, которые объясняют, как это сделать, но я слишком много времени трачу, пытаясь заставить его работать без успеха ...

Официальный документ: https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-sign_in-using-their-username-or-email-address

В официальном документе они объясняют, как войти, используя имя пользователя ИЛИ адрес электронной почты. Я просто хочу войти, используя только имя пользователя.

Что я сделал:

1.  rails generate migration add_username_to_users username:string
2.  rake db:migrate
3.  rails generate devise:views

Мое приложение / models / user.rb: (я только добавил: имя пользователя в attr_accessible)

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :username, :email, :password, :password_confirmation, :remember_me

end

Мой конфиг / инициализаторы / devise.rb:

 ...
 config.authentication_keys = [ :username ]
 ...

Мое приложение / views / devise / session / new.html.erb:

...
  <p><%= f.label :username %><br />
  <%= f.text_field :username %></p>
...

Я верю, что это все, что нужно изменить, но он просто скажет "неверный адрес электронной почты или пароль".

Спасибо за вашу помощь ..!

Ответы [ 3 ]

1 голос
/ 20 сентября 2012

Вы должны изменить строки в config/locales/devise.en.yml.Изменить:

invalid:email or password  

На:

invalid:username or password
1 голос
/ 16 июня 2011

Переписали ли вы метод find_for_database_authentication, как вы спрашивали в документации Devise, которую вы предоставили?

Примерно так:

protected

def self.find_for_database_authentication(warden_conditions)
  conditions = warden_conditions.dup
  login = conditions.delete(:login)
  where(conditions).where(["lower(username) = :value", { :value => login.downcase }]).first
end

Должно заставить это работать.

0 голосов
/ 18 июня 2011

Добавьте это к app/models/user.rb

def self.find_for_database_authentication(conditions={})
  self.where("username = ?", conditions[:username]).limit(1).first 
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...