Использование безопасного пароля в приложении rails 4

Я пытаюсь использовать has_secure_password для входа пользователя, я определил режим пользователя, как показано ниже.

require 'digest/md5'

class User < ActiveRecord::Base

    has_secure_password
    before_validation :prep_emailId
    before_save :create_avatar_url

    validates :emailId, presence: true, uniqueness: true, format: { with: /\A(|(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9]+@((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6})\z/i }
    validates :first_name, presence: true

    has_many :projects
    belongs_to :nationality
    belongs_to :category

    scope :sorted, lambda{order("projects.position ASC")}
    scope :newest_first, lambda{ "projects.created_at DESC"}
    scope :oldest_first, lambda{order("projects.created_at ASC")}
    scope :search, lambda{|query|
        where(["name LIKE?", "%#{query}%"])
    }

    private 
    def prep_emailId
        self.emailId = self.emailId.strip.downcase if self.emailId
    end

    def create_avatar_url
        self.avatar_url = "http://www.gravatar.com/avatar/#{Digest::MD5.hexdigest(self.emailId)}?s=50"
    end

end

Я объявил сильные параметры на контроллере

def user_params
    params.require(:user).permit(:category_id, :nationality_id, :first_name,
        :last_name, :gender, :date_of_birth, :emailId, :password, 
        :password_confirmation, password_digest, :avatar_url)
end

Вот мой метод создания.

def create
    @user = User.new(user_params)
    if @user.save
        redirect_to user_path(@user.id) 
        #notice: "Thanks you for signing up !!!"
    else
        render ('new')
    end
end

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

Password digest missing on new record

Теперь, если я уберу attr_accessor из этого кода, как это было предложено многими в stackoverflow, это то, что я в конечном итоге получу.

Mysql2::Error: Data too long for column 'password_digest' at row 1: INSERT INTO `users` (`avatar_url`, `created_at`, `emailId`, `first_name`, `last_name`, `password_digest`, `updated_at`) VALUES ('http://www.gravatar.com/avatar/f76ca3885ff46187f3a216ba566623b9?s=50', '2014-03-17 10:39:01', '[email protected]', 'funny', 'funnier', '$2a$10$lJp6l70lHepWGz08f4O7luT3kE6Wj7bYzqD3o6G.EErkl0FTbAiHq', '2014-03-17 10:39:01')

person Community    schedule 17.03.2014    source источник


Ответы (1)


Вам не нужны attr_accessors, так как has_secure_password обрабатывает это и проверку. Вам понадобится password_confirmation в представлении, а не подтверждение пароля.

person j-dexx    schedule 17.03.2014
comment
Если я закомментирую attr_accessors, я получаю Mysql2::Error: Данные слишком длинные для столбца 'password_digest' в строке 1: INSERT INTO users (avatar_url, created_at, emailId, first_name, last_name, password_digest, updated_at) VALUES ('gravatar.com/avatar/01961fa58430d5f70aaa452694244068?s=50', '2014-103-17 :24:50', '[email protected]', 'something', 'ничего', '$2a$10$lfzZ4PsehM0tJmBGR3V.A.l6l9TPNd0k2PAWEUeSk.Z2Px9D.14Ra', '2014-03-17 10:24:50' ) - person ; 17.03.2014
comment
Почему у вас есть это, включая ActiveModel::SecurePassword::InstanceMethodsOnActivation Позже у вас есть метод в вашей модели, который преобразует пароль в безопасный? Вот что делает has_secure_password. Убери и это. - person j-dexx; 17.03.2014
comment
Можете ли вы опубликовать свою полную модель пользователя, пожалуйста - person j-dexx; 17.03.2014
comment
Удалите проверку пароля и метод encrypt_password - person j-dexx; 17.03.2014
comment
давайте продолжим это обсуждение в чате - person ; 17.03.2014
comment
Удалите любое ограничение длины поля дайджеста пароля в БД. - person j-dexx; 17.03.2014