Атрибут не поддерживается базой данных, не обновляемой

Я пытаюсь создать модель User для моего приложения Ruby on Rails, в котором есть поле password, которое не сохраняется в базе данных, но по какой-то причине оно не обновляется правильно.

class User < ActiveRecord::Base
 attr :password
 validates_presence_of :email, :password_digest

 def password!
 password_digest = Digest::SHA1.hexdigest(password)
 end

 def password?(password)
 password_digest == Digest::SHA1.hexdigest(password)
 end
end

Я использую очень базовую форму для обновления email и password.

= form_for @user do |f|
 -if @user.errors.any?
 #error_explanation
 %h2= "#{pluralize(@user.errors.count, "error")} prohibited this user from being saved:"
 %ul
 - @user.errors.full_messages.each do |msg|
 %li= msg

 .field
 = f.label :email
 = f.email_field :email, :required => true
 .field
 = f.label :password
 = f.password_field :password, :required => true
 .actions
 = f.submit 'Save'

В моем контроллере я пытаюсь использовать основной механизм обновления, хотя я готов добавить еще код, если мне это абсолютно необходимо.

class UsersController < ApplicationController
 def create
 @user = User.new(params[:user])

 @user.password!

 respond_to do |format|
 if @user.save
 format.html { redirect_to @user, notice: 'User was successfully created.' }
 format.json { render json: @user, status: :created, location: @user }
 else
 format.html { render action: "new" }
 format.json { render json: @user.errors, status: :unprocessable_entity }
 end
 end
 end
end

Когда это обновление обрабатывается, он выдает TypeError с сообщением: can't convert nil into String.

Я испробовал несколько разных способов исправить это, включая ручную установку password с помощью params[:user][:password] но это не сработает. Может ли кто-нибудь обнаружить ошибку, которую мне не хватает?

1 ответ

В вашем пароле! метод, вам нужно указать, что вы хотите получить доступ к переменной экземпляра password_digest. Изменить на:

def password!
 self.password_digest = Digest::SHA1.hexdigest(password)
end

licensed under cc by-sa 3.0 with attribution.