我正在关注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
答案 0 :(得分:1)
DiAlex,你有代码产生这个吗?我想尝试一下。由于问题实际上是在保存之前发生但在“初始化”之后,我无法看到重新加载或验证是如何重要的。
更新:根据测试和来回回顾,我认为您的问题与滥用attr_accessor
和attr_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