Rails属性头痛

osk*_*bor 1 activerecord ruby-on-rails ruby-on-rails-3

新手铁路问题即将来临.

我有一个这样的课:

class Thing < ActiveRecord::Base
    attr_accessible :name
    attr_accessor :name
    validates_uniqueness_of :name, :case_sensitive => false
end
Run Code Online (Sandbox Code Playgroud)

我已完成迁移,表格看起来还不错.然后我启动rails console并尝试以下操作:

t = Thing.new(:name => "test")
=> #<Thing id: nil, name: nil, description: nil, created_at: nil, updated_at: nil> 
Run Code Online (Sandbox Code Playgroud)

已经在这里它说名字是零,为什么?继续,我试试这个:

t.name
 => "test"
Run Code Online (Sandbox Code Playgroud)

现在名字似乎设定了吗?如果我试图保存:

t.save!
Thing Exists (8.0ms)  SELECT 1 AS one FROM "things" WHERE LOWER("things"."name") = LOWER('test') LIMIT 1
SQL (16.0ms)  INSERT INTO "things" ("created_at", "description", "name", "updated_at") VALUES ('2012-10-28 16:10:12.701000', NULL, NULL, '2012-10-28 16:10:12.701000')
=> true 
Run Code Online (Sandbox Code Playgroud)

为什么我指定的名称没有保存?我想要的是能够在调用new时将属性指定为哈希,然后保存实例.

pja*_*jam 5

你应该删除attr_accessor :name,这创建getter和setter name,但它们已经由ActiveRecord创建

  • 发现.为了解释这个答案,当你想要一个没有持久存储到数据库的'虚拟属性'时,你只需要`attr_accessor`.如果表中有`name`字段,ActiveRecord会自动为您创建`#name`和`#name =`方法. (3认同)