Атрибут не поддерживается базой данных, не обновляемой - PullRequest
0 голосов
/ 28 февраля 2012

Я пытаюсь создать модель 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 Ответ

2 голосов
/ 28 февраля 2012

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

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