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

时间:2011-10-22 04:16:29

标签: 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 }

这是sessions / create

的代码
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

2 个答案:

答案 0 :(得分:5)

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

validates :email, :presence   => true,
                  :format     => { :with => email_regex },
                  :uniqueness => { :case_sensitive => false }

正在使用的正则表达式在哪里?它被用于:format,因此正则表达式仅用于查看传入的电子邮件地址是否与有效的电子邮件地址相似,而且与唯一性无关。 :uniqueness validates参数指定在确保电子邮件地址唯一时不应考虑这种情况。因此,您不能让两个用户的电子邮件地址仅因大小写而异。

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

答案 1 :(得分:5)

这与验证无关。 这与

有关
  1. 电子邮件地址如何存储在数据库中(假设有些大写,有些小写)
  2. User.authenticate的工作原理(我假设它有一个User.find_by_email)
  3. 看看这个问题,我从来没有真正想过这个问题。

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

    1. 将所有电子邮件存储为小写,并使User.authenticate执行相同的操作
    2. 确保User.authenticate不区分大小写。
    3. 但我感觉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), ...)