无法为 ActiveModel 属性赋值 (rails 4.2)

Unable to assign value to an ActiveModel attribute (rails 4.2)

我在 rails 4.2 中创建了一个简单的用户模型。但是我无法在 rails 控制台

中分配任何属性值
2.1.5 :001 > u = User.new
=> #<User id: nil, name: nil, email: nil, auth_token: nil, created_at: nil, updated_at: nil, enabled: true>
2.1.5 :002 > u.name = 'sample'
=> "sample"
2.1.5 :003 > u.changed
=> []
2.1.5 :004 > u
=> #<User id: nil, name: nil, email: nil, auth_token: nil, created_at: nil, updated_at: nil, enabled: true>

如您所见,尽管设置了名称,但值并未更改。

这是模型文件

class User < ActiveRecord::Base
  self.primary_key = :id

  include Tokenable
  include Creatable
  include Updatable

  attr_accessor :name, :email, :auth_token, :created_at, :updated_at, :enabled
end

我知道这在 rails 3.2

中工作正常

您需要在分配新值后保存记录。您可以通过在对象上调用 update_attribute!save! 来实现。你的情况:

u.name = "sample"
u.save!

u.update_attribute("name", "sample")

请注意,update_attribute 更新单个属性并保存记录,而无需经过正常的验证过程

ActiveRecord 最大的 "selling points" 之一是它会根据 DB 模式在您的模型中自动创建 setter 和 getter。

这些不仅仅是由 attr_accessor 创建的普通访问器(这是普通的 Ruby),它们将值转换为正确的类型并进行脏跟踪等。

当您使用 attr_accessor 时,您生成的 setter 和 getter 会破坏 ActiveRecord 创建的那些 - 这意味着 AR 将不会跟踪更改或保留属性。

这才是你真正想要的:

class User < ActiveRecord::Base
  include Tokenable
  include Creatable
  include Updatable
end

仅当您需要非持久性 ("virtual") 属性的设置器和获取器时,才在模型中使用 attr_accessor