4

名前をキーとして使用して、表示時に大文字と小文字を区別しながら、大文字と小文字を無視して登録するときに名前を検証するにはどうすればよいですか?

config/initializers/devise.rb、設定config.case_insensitive_keys = [ :name ]する前に名前全体を小文字に設定しているようです。

例:一部の人物は自分自身をTheFourthMusketeerと名付けています。

  • ビューには、4番目の銃士ではなく、4番目の銃士が表示されます
  • たとえば、tHEfourthMUSKETEERの下で新規ユーザーを登録することはできません。
4

2 に答える 2

6

大文字と小文字を区別しないように設定しないことをお勧めします:name。これにより、大文字と小文字を区別する名前がデータベースに適切に保存されます。

config.case_insensitive_keys = []

次に、User のクラス メソッドをオーバーライドしfind_first_by_auth_conditionsて、名前でユーザーを検索します。このコードはデータベースによって異なることに注意してください (以下では Postgres を使用しています)。

def self.find_first_by_auth_conditions(warden_conditions)
  conditions = warden_conditions.dup
  if login = conditions.delete(:login)
    where(conditions).where("lower(name) = ?", login.downcase).first
  else
    where(conditions).first
  end
end

これを行うと、「TheFourthMusketeer」User.find_for_authentication(login: 'thefourthmusketeer')のレコードが適切に返されます。name

このメソッドのオーバーライドの説明については、https://github.com/plataformatec/devise/wiki/How-To: -Allow-users-to-sign-in-using-their-username-or-email-address を参照してください。

于 2013-01-25T06:07:48.580 に答える
2

登録時に大文字と小文字が区別されるため、受け入れられた回答は不完全です。たとえば、'username' と 'USERNAME' は両方とも正常に登録できますが、ログインできるのは最初の 1 つだけです。

大文字と小文字を区別しないキーを無効にしますconfig/initializers/devise.rb(これはモデル固有の場合もあるため、こちらも確認してください):

config.case_insensitive_keys = []

find_first_by_auth_conditionsのメソッドを上書きしmodels/user.rbます:

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

...そして以下にもvalidates_uniqueness_of設定models/user.rb:

validates_uniqueness_of :username, :case_sensitive => false

大文字と小文字を区別しない認証、大文字と小文字を区別しない登録、データベースで大文字と小文字を保持します。

于 2016-01-26T07:40:18.420 に答える