0

用户模型:

class User < ActiveRecord::Base
 before_save { self.email == email.downcase }
 attr_accessor :name, :email

 validates :name, presence: true
 VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
 validates :email, presence: true, format: { with: VALID_EMAIL_REGEX },
                        uniqueness: { case_sensitive: false}

 has_secure_password
 validates :password, length: { minimum: 6 }
end

控制台内部:

:001 > User.all
User Load (3.1ms)  SELECT "users".* FROM "users"
=> #<ActiveRecord::Relation []>

:002 > User.create(name: "Ryan Waits", email: "ryan.waits@gmail.com", password:
"foobar", password_confirmation: "foobar")
(0.1ms)  begin transaction
User Exists (0.2ms)  SELECT 1 AS one FROM "users" WHERE LOWER("users"."email") =
LOWER('ryan.waits@gmail.com') LIMIT 1
Binary data inserted for `string` type on column `password_digest`
SQL (6.8ms)  INSERT INTO "users" ("created_at", "password_digest", "updated_at") VALUES
(?, ?, ?)  [["created_at", Sat, 02 Nov 2013 16:20:10 UTC +00:00], ["password_digest",
"$2a$10$5MhI5u90tFqO3rrS58DW7eeNBdNCCveBA.IfqHp6OpwonYNaigyPO"], ["updated_at", Sat, 02
Nov 2013 16:20:10 UTC +00:00]]
(1.3ms)  commit transaction

=> #<User id: 3, name: nil, email: nil, created_at: "2013-11-02 16:20:10", updated_at:
"2013-11-02 16:20:10", password_digest:
"$2a$10$5MhI5u90tFqO3rrS58DW7eeNBdNCCveBA.IfqHp6Opwo..."> 

(user = User.all) user.name 带回“用户”,电子邮件和密码属性带回用户对象上的未定义方法错误。

*笔记:

我创建了另一个具有不同属性的用户,结果相同,但名称、电子邮件、属性返回 nil 而不是“用户”和未定义的方法错误。

*更新:

所以我现在意识到,这条消息正在命中唯一性验证:

SELECT 1 AS one FROM "users" WHERE LOWER("users"."email") =
LOWER('ryan.waits@gmail.com') LIMIT

但是当我用新属性测试一个新用户时,使用 create 方法时它仍然返回 nil 属性。但是,像这样 (user.name = "adhsasd") 更新属性将创建一个用户。但是当我查询 User.all 时,属性又变为零,并且用户再次无效......我是否以某种方式访问​​了不同的数据库?我要转身了...

4

1 回答 1

2

基本上,我认为您希望在模型中使用 attr_accessible 而不是 attr_accessor ...

这个答案

“attr_accessor 是 ruby​​ 代码,当您的数据库中没有列,但仍想在表单中显示字段时使用。唯一允许这样做的方法是 attr_accessor :fieldname,您可以在视图中使用此字段, 或模型,如果你愿意,但主要在你的视图中。

attr_accessible 允许您列出您想要允许批量分配的所有列,正如 andy 上面所忽略的那样。与此相反的是 attr_protected,这意味着我不希望允许任何人批量分配到该字段。更有可能的是,它会成为您的数据库中的一个字段,您不希望任何人与之胡闹。像状态字段,或类似的。”

于 2013-11-02T17:20:52.900 回答