Rails教程区分大小写不起作用

Ton*_*ony 3 ruby-on-rails case-sensitive

我正在关注Rails教程,在注册我的网站后,我正在尝试登录.我最近在我的应用程序中注意到,如果我将我的电子邮件地址大写,我会收到无效的用户名/密码消息.我在Rubular上测试了正则表达式,它适用于大写,因此不可能.

也许这涉及会议?

 email_regex = /\A[\w+\-.]+@[csupomona\d\-.]+[edu]+\z/i

     validates :email, :presence   => true,
                        :format     => { :with => email_regex },
                        :uniqueness => { :case_sensitive => false }
Run Code Online (Sandbox Code Playgroud)

这是会话/创建的代码

def create
      user = User.authenticate(params[:session][:email],
                             params[:session][:password])
    if user.nil?
      flash.now[:error] = "Invalid email/password combination."
      @title = "Sign in"
      render 'new'
    else
      sign_in user
      redirect_to root_path
    end
  end
Run Code Online (Sandbox Code Playgroud)

mu *_*ort 5

你对正则表达式的含义有点困惑.我们来看看这个:

validates :email, :presence   => true,
                  :format     => { :with => email_regex },
                  :uniqueness => { :case_sensitive => false }
Run Code Online (Sandbox Code Playgroud)

正在使用的正则表达式在哪里?它正在被用于:format所以正则表达式仅用于查看传入的电子邮件地址是否看起来像有效的电子邮件地址,并且与唯一性无关.确保电子邮件地址唯一时,不应考虑指定该案例的:uniqueness参数validates.因此,您不能让两个用户的电子邮件地址仅因大小写而异.

您所展示的代码中没有任何内容可以说明当您尝试与某人签约时如何比较电子邮件地址,以及您遇到麻烦的地方.您必须更新您的User.authenticate类方法,以便对电子邮件地址进行不区分大小写的搜索.


Mat*_*udy 5

这与验证无关.这是与

  1. 电子邮件地址如何存储在数据库中(假设有些大写,有些是小写)
  2. 如何User.authenticate工作(我假设它做了User.find_by_email)

看看这个问题,我从来没有真正想过这个问题.

但要解决这个问题,有几种方法可以解决这个问题.

  1. 将所有电子邮件存储为小写,并User.authenticate执行相同操作
  2. 确保User.authenticate不区分大小写.

但我有一种User.authenticate来自Devise或类似的感觉.所以1.可能是最好的解决方案

class User

  # all email writes get lowercased
  def email=(value)
    self[:email] = value && value.downcase
  end

end

user = User.authenticate(params[:session][:email].try(:downcase), ...)
Run Code Online (Sandbox Code Playgroud)