6

How To:ユーザーがユーザー名または電子メールアドレスを使用してサインインできるようにし、そこで説明されているすべての手順を実行しましたが、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

この問題に関するアドバイスはありますか?

=======更新

ここで何かを見つけました■[rails]DeviseとRailsの使用方法、ここに電子メールがない場合は、次のようになります。

  # Email is not required
  def email_required?
    false
  end

これをモデルに追加すると、ユーザー名を使用して電子メールフィールドを空白のままにしてレコードを作成できますが、電子メールを使用せずに2番目のレコードを作成しようとすると、データベースでエラーが発生します。

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

これを使用して、データベースのテーブルからインデックスを削除usernameし、モデルでを検証する必要がありますか?そのモデルではメールフィールドは本当に必要ないからです。

4

2 に答える 2

12

アップデート

以下のAsiniyの答えは、実際には魅力のように機能します(:

オリジナル(誰が知っていましたか?)

あなたの問題はmysqlテーブルのインデックスです。あなたはそれをあなたの移行から削除するかもしれませんが、それがあなたの問題を解決するかどうかはわかりません。Deviseで電子メールを使用しないのは注意が必要です。このような、からの偽の電子メールのような回避策を提案しますusername

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

あまりきれいではありませんが、omniauthを使用すると、パスワードに対して同様のことを行うデバイスが表示されます。

Rails4と強力なパラメーター

私はinrails4でこの問題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

これはDeviseDocで説明されています

于 2013-05-17T03:08:02.557 に答える
6

通常の解決策

class User < AR::Base
  devise_for tralala

  def email_required?
    false
  end
end

https://github.com/plataformatec/devise/blob/master/lib/devise/models/validatable.rb#L29を参照してください

于 2014-12-31T16:23:21.077 に答える