#ruby-on-rails #ruby #web-applications
#ruby-on-rails #ruby #веб-приложения
Вопрос:
Я пытаюсь добавить пароль на свой веб-сайт. Но когда я регистрирую учетную запись, страница, которая отображается после нажатия кнопки регистрации, является страницей с ошибкой, отображающей:
неопределенный метод salt=' for #<User:0x37f8168>
encrypt_password’ app/controllers/users_controller.rb:19: в `create’
app/models/user.rb:34:in
В моем user.rb у меня есть:
def encrypt_password
self.salt = make_salt if new_record?
self.encrypted_password = encrypt(password)
end
def encrypt(string)
secure_hash("#{salt}--#{string}")
end
В users_controller.rb у меня есть
def create
@user = User.new(params[:user])
if @user.save
sign_in @user
flash[:success] = "Welcome to PennTwit"
redirect_to @user
else
@title = "Sign up"
render 'new'
end
end
Ошибка связана со строками:
if @user.save
self.salt = make_salt if new_record?
Я попытался изменить self.соль в @salt, но это выдало мне другую ошибку, в которой говорилось, что соль в
secure_hash(«#{соль}—#{строка}») не найден.
Есть идеи? Спасибо!
Комментарии:
1. Используете ли вы плагин? (Это restful_authentication?)
2. Я не думаю, что использую плагин. Что такое restful_authentication?
3. railscasts.com/episodes/67-restful-authentication (в наши дни это старая новость, но ваш код выглядит удивительно похожим, вплоть до двойного тире между salt / password). Посмотрите каталог вашего поставщика / плагинов.
Ответ №1:
Это означает, что salt
это an undefined method
🙂
Я думаю, что у вас нет salt
поля в users
таблице вашей базы данных.
Покажите структуру вашей пользовательской таблицы (или, по крайней мере, миграцию)
Комментарии:
1. Я сделал так, что rails сгенерировал миграцию add_salt_to_users salt:string Это должно добавить его в БД, не так ли? Но я все еще получаю эту ошибку.
Ответ №2:
Вы должны создать salt
атрибут as attr_accessor
в вашей модели, например
attr_accessor :salt
Комментарии:
1. Я попробовал это и получил новую ошибку: неопределенный метод `encrypted_password =’, что странно, потому что в этом методе есть соль, и он раньше не обнаруживал эту ошибку.
2. сделайте то же самое с encrypted_password
3. attr_accessor автоматически создает методы get, set и salt=.
Ответ №3:
в файл gem добавьте Bcrypt, отвечающий за шифрование / декретирование
gem «bcrypt-ruby», :require => «bcrypt»
теперь отредактируйте свой метод
def encrypt_password
if password.present?
self.password_salt = BCrypt::Engine.generate_salt
self.password_hash = BCrypt::Engine.hash_secret(password, password_salt)
end