Created
March 13, 2011 06:43
-
-
Save kulbirsaini/867932 to your computer and use it in GitHub Desktop.
Devise configuration to allow username or email address for sign_in, confirmation, unlock, forgot password instructions.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
################################################################ | |
# For views/migrations etc. check http://tinyurl.com/3xfx3zm # | |
################################################################ | |
# File : RAILS_APP/config/initializers/devise.rb | |
# Change the following only. Rest can stay same | |
# NOTE : You must use devise master or any version released after Mar 13, 2011 to get everything mentioned here working. | |
config.authentication_keys = [ :login ] | |
config.confirmation_keys = [ :login ] | |
config.unlock_keys = [ :login ] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
############################################################### | |
# IMPORTANT: You need meta_where gem for where clause to work # | |
# Tinker accordingly if you don't want to use meta_where # | |
############################################################### | |
# File : RAILS_APP/app/models/user.rb | |
# Your user model. Select appropriate model depending on your devise config | |
# To facilitate username or email login | |
attr_accessor :login | |
# Setup accessible (or protected) attributes for your model | |
# NOTE the :login here. | |
attr_accessible :login, :username, :email, :password, :password_confirmation, :remember_me | |
# Essential functions | |
protected | |
def self.find_for_database_authentication(conditions) | |
login = conditions.delete(:login) | |
u = self.arel_table | |
where(conditions).where(u[:username].eq(login).or(u[:email].eq(login))).first | |
end | |
def self.find_or_initialize_with_errors(required_attributes, attributes, error=:invalid) | |
case_insensitive_keys.each { |k| attributes[k].try(:downcase!) } | |
attributes = attributes.slice(*required_attributes) | |
attributes.delete_if { |key, value| value.blank? } | |
if attributes.size == required_attributes.size | |
if attributes.has_key?(:login) | |
login = attributes.delete(:login) | |
record = find_record(login) | |
else | |
record = where(attributes).first | |
end | |
end | |
unless record | |
record = new | |
required_attributes.each do |key| | |
value = attributes[key] | |
record.send("#{key}=", value) | |
record.errors.add(key, value.present? ? error : :blank) | |
end | |
end | |
record | |
end | |
def self.find_record(login) | |
u = self.arel_table | |
where(u[:username].eq(login).or(u[:email].eq(login))).first | |
end |
Thanks!
line 22
where(conditions).where({:username => login} | { :email => login}).first
should be
where(conditions).where({:username => login} || { :email => login}).first
and you're the best
@paatsinsuwan I was actually using meta_where ruby gem and that syntax worked. The syntax you suggested will not work. Just check the generated sql for your query
User.where(conditions).where({:username => login} || { :email => login}).to_sql
I have made the modification so that things work properly without meta_where.
按着你的这么写的 登录提示密码错误 登陆会报错 不过我的注册需要邮箱才能注册 注册成功是直接进入登录的状态的 以此证明用户名 密码没错 即使邮箱+密码也不能登陆了 我需要怎么才能找到错误的地方
还有一点 rails5 使用attr_accessible 会报错 我是这么写的
def user_params
params.require(:user).permit(:login, :username, :email,
:password, :password_confirmation, :remember_me)
end
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
In your User (or corresponding) model, check that database field login is in the list of accessible attributes.
Example:
In file app/model/user.rb
attr_accessible :login, :password, :blah, :foo, :bar