为什么user.save为true但电子邮件显示为nil?

时间:2011-09-01 20:03:52

标签: ruby-on-rails-3 null

我正在使用嵌套的模型表单进行注册,并且正在作为初学者解决问题。特别突然出现的一个问题是,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 创建新的用户/个人资料,我会按照以下流程进行操作:

NameError: undefined local variable or method 'params' for #<User:>

一切顺利,直到user.save,它给了我rails console。在create_profile中,它指向{。1}}

中的user.rb:25

所以这是我的用户模型:

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 个答案:

答案 0 :(得分:1)

attr_accessor只是在对象上定义“属性”,与ActiveRecord模型的attributes无关(attributes是字段和值的Hash从表中获得。)

ActiveRecord不保存attr_accessor定义的此类“属性”。 (基本上,attr_accessor同时定义了attr_reader和attr _ writer(即“getter”和“setter”)