无法为 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
。
我在 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
。