2012-07-26 167 views
6

我下面这个设计如何,对How To: Allow users to sign in using their username or email address并没有详细说明所有的台阶上,但是当我尝试通过registrations/new.html.erb形式注册我得到这个错误:“电子邮件不能为空”使用用户名或电子邮件

Email can't be blank 

在我的模型,我有:

devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

attr_accessible :username, :email, :password, :password_confirmation, :remember_me 

attr_accessor :login 
attr_accessible :login 

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

任何意见有这个问题?

======= UPDATE

我发现这里的东西在这里■[rails]How to use Devise and Rails , without EMail它是这样的:

# Email is not required 
    def email_required? 
    false 
    end 

用在我的模型加入我能创造一个记录用户名和离开电子邮件领域的空白,但是当我尝试没有电子邮件创建第二个记录的数据库上升了一个错误:

Mysql2::Error: Duplicate entry '' for key 'index_parents_on_email':... 

我应该利用这一点,从删除索引我表在数据库中,并且只验证模型中的username?因为我真的不需要该模型的电子邮件字段。

+0

Mr_Nizzle,你能接受更性感的方式吗? – asiniy 2015-04-18 11:57:43

回答

12

更新

低于实际Asiniy的答案就像一个魅力(?:

原件(谁知道)

你的问题是MySQL表索引,你可能会删除它来自你的迁移,但我不确定这会解决你的问题。在Devise中不使用电子邮件是棘手的,我会建议一个像username这样的假电子邮件的解决方法,像这样的

"#{user.username}@fake.me" 

这不是很干净,但我看到设计时使用omniauth做类似的密码。

轨道4个强大的参数

我在轨道4,5钻进这个问题username,我不得不为sign_up配置如下允许的参数:

class ApplicationController < ActionController::Base 

    before_filter :configure_permitted_parameters, if: :devise_controller? 

    protected 

    def configure_permitted_parameters 
     devise_parameter_sanitizer.for(:sign_up) do |u| 
     u.permit :username, :email, :password, :password_confirmation 
     end 
    end 
end 

This is described in Devise Doc

+0

omg,你提供了什么,请看看更好的解决方案 – asiniy 2014-12-31 16:23:42

+0

感谢巨大的帮助! – 2016-06-27 23:21:46

+0

感谢@NathanBertram,只是好奇,你是否尝试了@asiniy下面的更简单的解决方案? – ecoologic 2016-06-28 00:24:45

相关问题