Почему этот неиспользуемый метод self.hash вызывает ошибку «невозможно преобразовать строку в целое число»? - PullRequest
0 голосов
/ 14 февраля 2012

Я бегу по учебнику Lynda Rails 3 . В какой-то момент в контроллере с именем access_controller мы вызываем метод из модели с именем AdminUser. Исходный звонок был:

authorized_user = AdminUser.authenticate(params[:username], params[:password])

Когда я запускаю rails server, открываю браузер и получаю доступ к соответствующему представлению, я получаю сообщение об ошибке: TypeError, невозможно преобразовать строку в целое число

Этот же вопрос задавался дважды до . В первый раз спрашивающий говорит, что проблема решилась на следующий день. (Я впервые столкнулся с этим 3 дня назад, так что этого не произошло.) На второй вопрос не было ответа. Я постараюсь предоставить гораздо более подробную информацию:

Метод в модели был:

  def self.authenticate(username="", password="")
    user = AdminUser.find_by_username(username)
    if user && user.password_match?(password)
      return user
    else
      return false
    end
  end

Когда я вызываю этот метод из консоли rails, он работает совершенно нормально. Кажется, что-то не так в вызове с контроллера или попытке получить доступ через браузер (я относительный новичок, поэтому я извиняюсь, что не могу выразить эту мысль лучше). С тех пор я повторил эту ошибку с более простым методом в той же модели AdminUser:

  def self.nothing
    true
  end

Это все равно дает мне ту же ошибку. Затем я попытался вызвать метод self.nothing из другого контроллера и действия (называемого pages_controller # show). Когда я попытался открыть это в браузере, я снова получил ту же ошибку: «не могу преобразовать строку в целое число»

Затем я создал идентичный метод self.nothing в моей предметной модели. Когда я пытаюсь запустить этот метод из действия show в pages_controller, он работает совершенно нормально. Нет ошибок.

Итак, тот же метод работает совершенно нормально в консоли rails, совершенно нормально, когда я помещаю его в мою модель Subject, но выдает ошибку, когда я помещаю его в мою модель AdminUser.

Затем я попытался закомментировать практически все, что видно в моей модели AdminUser, чтобы посмотреть, смогу ли я устранить ошибку. Я наконец смог. Ошибка, по-видимому, была вызвана другим методом:

 def self.hash(password="")
   Digest::SHA1.hexdigest(password)
 end

Я должен был удалить этот метод несколько видео уроков назад, когда мы добавили эти другие методы:

 def self.make_salt(username="")
   Digest::SHA1.hexdigest("Use #{username} with #{Time.now} to make salt")
 end

 def self.hash_with_salt(password="", salt="")
   Digest::SHA1.hexdigest("Put #{salt} on the #{password}")
 end

Я никогда не удалял исходный, но по какой-то причине именно он стал причиной ошибки.

Итак, мой вопрос сейчас: почему выход из этого метода (который нигде не использовался) приводил к ошибке «невозможно преобразовать строку в целое число»?

1 Ответ

1 голос
/ 07 марта 2013

Причина в том, что User.hash переопределяет Object.hash, что должно возвращать Fixnum.Вы должны изменить его имя на что-то вроде User.make_hash

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