Rails Tutorial не работает с учетом регистра - PullRequest
3 голосов
/ 22 октября 2011

Я следую учебному пособию по Rails и после регистрации на своем сайте пытаюсь войти в систему. Недавно я заметил в своем приложении, что, если я буду использовать свой адрес электронной почты с большой буквы, я получу сообщение о неверном имени пользователя / пароле.Я протестировал регулярное выражение на Rubular, и оно работает с заглавными буквами, поэтому не может быть.

Может быть, это касается сессий?

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

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

Вот код для сессий / 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 ]

5 голосов
/ 22 октября 2011

Это не имеет ничего общего с проверкой. Это связано с

  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), ...)
5 голосов
/ 22 октября 2011

Вы немного озадачены тем, для чего это регулярное выражение.Давайте посмотрим на это:

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

Где используется регулярное выражение?Он используется для :format, поэтому регулярное выражение используется только для того, чтобы увидеть, похож ли адрес входящей электронной почты на действительный адрес электронной почты и не имеет ничего общего с уникальностью.Параметр :uniqueness для validates указывает, что случай не должен учитываться при обеспечении уникальности адресов электронной почты.Таким образом, у вас не может быть двух пользователей, адреса электронной почты которых отличаются только регистром.

Ничто в показанном коде не говорит о том, как сравниваются адреса электронной почты, когда вы пытаетесь подписать кого-то, и именно здесьУ вас проблемы.Вам нужно обновить метод класса User.authenticate, чтобы выполнить поиск адреса электронной почты без учета регистра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...