Почему user.save имеет значение true, а электронная почта отображается как ноль? - PullRequest
0 голосов
/ 02 сентября 2011

Я использую форму вложенной модели для регистрации и работаю через петли как новичок. Одна проблема, которая, в частности, всплыла, но которую я действительно не понимаю, это user.email, возвращается как nil.

Прежде чем я начал играть с вложенной формой модели, я мог создавать записи в консоли без проблем. Однако сейчас я не могу создавать записи, и некоторые из последних созданных записей имеют nil в качестве электронной почты. (Я не уверен, имеет ли это какое-либо отношение к вложенной модели, но это мой ориентир, когда она начала выходить из строя.)

Если я зайду в rails console, чтобы создать нового пользователя / профиль, я буду следовать этому процессу:

user = User.new
user.email = ""
user.password = ""
user.profile = Profile.new
user.profile.first_name = ""
...
user.profile.save
user.save

Все идет хорошо до user.save, который дает мне NameError: undefined local variable or method 'params' for #<User:>. В rails console он указывает на user.rb: 25 в create_profile

Итак, вот моя модель пользователя:

class User < ActiveRecord::Base
  attr_accessor :password, :email
  has_one :profile, :dependent => :destroy
  accepts_nested_attributes_for :profile

  validates :email, :uniqueness => true,
            :length => { :within => 5..50 },
            :format => { :with => /^[^@][\w.-]+@[\w.-]+[.][a-z]{2,4}$/i }
  validates :password, :confirmation => true,
            :length => { :within 4..20 },
            :presence => true,
            :if => :password_required?

  before_save :encrypt_new_password
  after_save :create_profile

  def self.authenticate(email, password)
    user = find_by_email(email)
    return user if user && user.authenticated?(password)
  end

  def authenticated?(password)
    self.hashed_password == encrypt(password
  end

  protected
    def encrypt_new_password
      return if password.blank?
      self.hashed_password = encrypt(password)
    end
    def password_required?
      hashed_password.blank? || password.present?
    end
    def encrypt(string)
      Digest::SHA1.hexdigest(string)
    end
  end

Может кто-нибудь помочь мне понять, что происходит?

ОБНОВЛЕНИЕ: Я пытался изменить свое регулярное выражение, но все еще вижу ноль для электронной почты. Хотя в предыдущем посте SO говорилось, что не нужно слепо копировать регулярные выражения без тестирования, так что, возможно, я просто не протестировал его правильно. Хорошие новости: я больше не получаю сообщение об ошибке.

1 Ответ

1 голос
/ 02 сентября 2011

attr_accessor просто определяет «свойство» объекта и не имеет отношения к attributes модели ActiveRecord (attributes представляет собой Hash полей и значений, полученных из таблицы).

ActiveRecord не сохраняет такие «свойства», как определено attr_accessor. (По сути, attr_accessor определяет attr_reader и attr_ writer (то есть "getter" и "setter") одновременно)

...