Rails控制台输出脏/过时的数据

时间:2014-02-09 15:30:37

标签: ruby-on-rails ruby rails-console

我正在关注Michael's Ruby on Rails tutorial (Chapter 6.2.2),当我转到rails console --sandbox尝试创建用户时,输出完全过时了。

我更新用户的属性,我返回用户,控制台输出所有属性的nil。但是,如果我输出user.attribute数据就在那里。

第一次保存失败,因为用户必须有一个名字,尽管我在addind验证之前就遇到了这个问题。

我在这里缺少什么?我按照所有说明操作,我正在做很基本的事情。我正在执行以下命令:

$ rails console --sandbox
Loading development environment in sandbox (Rails 4.0.2)
Any modifications you make will be rolled back on exit

2.1.0 :001 > user = User.new(name: "", email: "mhartl@example.com")
 => #<User id: nil, name: nil, email: nil, citizen_number: nil, created_at: nil, updated_at: nil> 
2.1.0 :002 > user.save
   (0.1ms)  SAVEPOINT active_record_1
   (0.2ms)  ROLLBACK TO SAVEPOINT active_record_1
 => false 
2.1.0 :003 > user.valid?
 => false 
2.1.0 :004 > user.name = "Bob"
 => "Bob" 
2.1.0 :005 > user.valid?
 => true 
2.1.0 :006 > user
 => #<User id: nil, name: nil, email: nil, citizen_number: nil, created_at: nil, updated_at: nil> 
2.1.0 :007 > user.save
   (0.2ms)  SAVEPOINT active_record_1
  SQL (6.2ms)  INSERT INTO "users" ("created_at", "updated_at") VALUES (?, ?)  [["created_at", Sat, 08 Feb 2014 19:15:37 UTC +00:00], ["updated_at", Sat, 08 Feb 2014 19:15:37 UTC +00:00]]
   (0.1ms)  RELEASE SAVEPOINT active_record_1
 => true 
2.1.0 :008 > user
 => #<User id: 1, name: nil, email: nil, citizen_number: nil, created_at: "2014-02-08 19:15:37", updated_at: "2014-02-08 19:15:37">

我的用户模型:

class User < ActiveRecord::Base

  attr_accessor :name, :email, :citizen_number

  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  VALID_CITIZEN_NUMBER_REGEX = /[1-9]\d{7,}/
  validates :name, presence: true, length: { maximum: 50 }
  validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false }
  validates :citizen_number, presence: true, format: { with: VALID_CITIZEN_NUMBER_REGEX }, uniqueness: true

  before_save { lowercase_email() }

  def lowercase_email() 
    self.email = email.downcase
  end

end

4 个答案:

答案 0 :(得分:1)

DiAlex,你有代码产生这个吗?我想尝试一下。由于问题实际上是在保存之前发生但在“初始化”之后,我无法看到重新加载或验证是如何重要的。

更新:根据测试和来回回顾,我认为您的问题与滥用attr_accessorattr_accessible有关。

尝试从:citizen_number删除attr_accessor。我试过了,你的代码开始工作(传递所有测试),控制台也开始输出正确的值。

答案 1 :(得分:0)

使用reload

user.reload应该为您的最新用户提供正确的属性,如Documentation中所述,它会从数据库重新加载此对象的属性,因此您现在可以将对象属性作为预期,如果他们保存正确

答案 2 :(得分:0)

Diogo,有些东西阻止了你user.save。首次尝试user.save后,请尝试user.errors。这将为您提供一个哈希,其中包含阻止模型保存的错误。

很可能您会在数据库方案中发现错误,因为user.valid?会返回true

答案 3 :(得分:0)

您是否尝试过没有沙箱模式?也许它在某种程度上限制了写作。

rails console