#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. Хм, только что узнал, что я повторно активировал его, я не знаю как, так что это стало причиной проблемы, спасибо за вашу помощь 🙂