Тесты переименованных переменных Ruby-on-Rails по-прежнему видят прежние имена

#ruby-on-rails #ruby #testing #rename #bcrypt

#ruby-on-rails #ruby #тестирование #переименовать #bcrypt

Вопрос:

Чтобы иметь более понятные имена для моего столбца, я выполнил следующую миграцию :

 class RenameDigestColumnsOnUserToEncryptedTokens < ActiveRecord::Migration[5.0]
  def change
    rename_column :users, :password_digest, :encrypted_password
    rename_column :users, :activation_digest, :encrypted_activation_token
    rename_column :users, :reset_digest, :encrypted_reset_password_token
  end
end
  

Это сработало хорошо, столбцы эффективно переименованы в моей базе данных.

Я соответственно переименовал все действия, которые я мог бы выполнить с этими именами, что означает, что в моем коде ничего не осталось, будь то Password_digest, activation_digest или reset_digest.

Проблема в том, что когда я запускаю тесты, я все равно получаю ошибки, как если бы я не переименовал их в проекте, например, такого рода ошибки :

 .E

Error:
PasswordResetsTest#test_password_resets:
NoMethodError: undefined method `password_digest' for #<User:0x00563d149684d8>
Did you mean?  password
    app/controllers/password_resets_controller.rb:29:in `update'
    test/integration/password_resets_test.rb:42:in `block in <class:PasswordResetsTest>'


bin/rails test test/integration/password_resets_test.rb:10
  

Код действия обновления password_resets_controller выглядит следующим образом :

 def update
    if params[:user][:password].empty?
      @user.errors.add(:password, "can't be empty")
      render 'edit'
    elsif @user.update_attributes(user_params)
      log_in @user
      # to prevent, on a public machine for example, people from pressing the back button and changing
      # the password (and getting logged in to the site) whereas it's always been reset
      @user.update_attribute(:encrypted_reset_password_token, nil)
      flash[:success] = 'Password has been reset.'
      redirect_to @user
    else
      render 'edit'
    end
  end
  

И связанный с ним метод log_in :

 # Logs in the given user.
  def log_in(user)
    session[:user_id] = user.id
  end
  

Я попытался перезапустить spring и даже перезагрузить компьютер, я не вижу, откуда он берется, как компьютер все еще может видеть эти имена.

Я использую драгоценный камень bcrypt для генерации зашифрованных токенов, ранее названных digest , и это те, которые я пытался переименовать.

У кого-нибудь когда-нибудь была эта проблема? Заранее спасибо за вашу помощь.

Комментарии:

1. Вы запускали миграцию в тестовой среде? bundle exec rake db:migrate RAILS_ENV=test

2. Да, я это сделал, я даже сбросил базу данных разработки, и у моего приложения та же проблема, что и у тестов, оно ищет предыдущие имена, поэтому оно больше не работает.

3. Можете ли вы опубликовать password_resets_controller.rb действие обновления?

4. Я отредактировал вопрос 🙂

5. какая строка является строкой 29 в password_resets_controller.rb:29 ?

Ответ №1:

Если вы видите ошибку в столбце password_digest, возможно, вы используете активную запись has_secure_password, для которой требуется этот столбец: http://api.rubyonrails.org/classes/ActiveModel/SecurePassword/ClassMethods.html

Комментарии:

1. На самом деле, я удалил devise из своего проекта, чтобы создать собственную систему аутентификации, и она хорошо работала до этого переименования…

2. То же самое, я удалил has_secure_password, чтобы создать его самостоятельно и настроить 🙂

3. Хм, только что узнал, что я повторно активировал его, я не знаю как, так что это стало причиной проблемы, спасибо за вашу помощь 🙂