неопределенный метод `salt =’

#ruby-on-rails #ruby #web-applications

#ruby-on-rails #ruby #веб-приложения

Вопрос:

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

неопределенный метод salt=' for #<User:0x37f8168>
app/models/user.rb:34:in
encrypt_password’ app/controllers/users_controller.rb:19: в `create’

В моем 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