Ruby on rails 哈特尔';s rails教程6.3.4练习2,为什么';新分配的名称是否保存?

Ruby on rails 哈特尔';s rails教程6.3.4练习2,为什么';新分配的名称是否保存?,ruby-on-rails,railstutorial.org,Ruby On Rails,Railstutorial.org,在本节中,我在我们的数据中创建了一个用户,练习中说通过指定一个新名称来更改用户的名称,然后使用save方法保存更改 我这样做了,结果返回错误。哈特尔问为什么它不起作用,我不知道为什么。我尝试在控制台中通过以下方式验证用户: user.authenticate("foobar") 然后尝试更改名称,但user.save仍返回false 编辑: 我通过指定一个新名称更改了名称 user.name = "Harry Caray" 但我认为我应该使用user.update\u属性(:name,“B

在本节中,我在我们的数据中创建了一个用户,练习中说通过指定一个新名称来更改用户的名称,然后使用save方法保存更改

我这样做了,结果返回错误。哈特尔问为什么它不起作用,我不知道为什么。我尝试在控制台中通过以下方式验证用户:

user.authenticate("foobar")
然后尝试更改名称,但user.save仍返回false

编辑:

我通过指定一个新名称更改了名称

user.name = "Harry Caray" 
但我认为我应该使用user.update\u属性(:name,“Big Lebowski”)


user.save仍然返回false,但重新加载后将保存名称

例如,您可以通过检查模型错误来了解原因-

user.name  = "new name"
@error_object = user.save
@error_object.errors.full_messages
如何更新用户名 从一个新的rails控制台开始,假设数据库中已经有一个用户,我们可以将其分配给一个局部变量,如下所示:

> user = User.find_by(email: "mhartl@example.com")
现在我们在内存中有一个
User
对象,它是数据库中用户的副本。我们可以通过以下方式确认这一点:

> user
=> #<User id: 1, name: "Michael Hartl", email: "mhartl@example.com", created_at: "2018-08-16 05:57:13", updated_at: "2018-08-16 06:15:04", password_digest: "$2a$10$bS2s/24d3ePLscZ8iT/NheDAvOZmODKjbCV5groq4v5...">
但是,如果我们尝试保存此用户,则会失败:

> user.save
=> false
然后,我们可以检查错误消息:

> user.errors.messages
=> {:password=>["can't be blank", "is too short (minimum is 6 characters)"]}
在哈特尔书的练习2中,他问我们为什么调用
.save
无效。它不起作用的原因是验证失败。在
app/models/user.rb
的用户模型中,我们特别声明,为了将用户添加到数据库中,应执行验证检查,以确保用户对象具有长度至少为6个字符的
密码
字符串。如果我们检查用户对象的
密码
字符串,我们会得到以下结果:

> user.password
=> nil
然后,我们只需输入本章前面提供的密码,就可以调用
。save

> user.password = "foobar"
=> "foobar"
> user.save
=> true
现在,我们可以检查以确保数据库已正确更新:

> User.find_by(email: "mhartl@example.com").name
=> "Ace Ventura"
哈特尔所说的“技术”是什么? 我上面给出的更新数据库条目的方法不是Hartl在问题3中提到的“技术”。我提供了这一部分来解释验证的进展情况。当Hartl提到一种“技术”时,他暗示你应该这样做:

> user.update_attribute(:name, "El Duderino")
=> true
(注意,我们在这里使用的是
update\u属性
,而不是复数版本
update\u属性
),正如Hartl在中所解释的那样,当我们只需要更新单个属性并且同时跳过验证时
我们应该使用
update\u属性

那么,authenticate方法做什么呢? 简单地说,
.authenticate
方法所做的就是回答以下问题:“如果我向用户对象提供了此密码,我是否能够将对象保存到数据库中?”因此,当我们这样做时:

> user.authenticate("not_the_right_password")
=> false
这里所做的一切都是告诉我们,如果我们设置
user.password=“不是正确的密码”
,当我们调用
.save
时,它将失败,因为我们的密码错误。它实际上不会改变对象本身的任何内容

保存呢?
引用:

有许多方法可以更改数据库中对象的状态。有些方法会触发验证,但有些不会。这意味着,如果不小心,可能会将数据库中的对象保存为无效状态

以下方法触发验证,并且仅当对象有效时才会将对象保存到数据库:

  • 创建
  • 创建
  • 保存
  • 保存
  • 更新
  • 更新
如果记录无效,bang版本(例如
保存!
)会引发异常。非bang版本不会:
save
update
返回
false
,而
create
只返回对象

请注意,
save
还可以在通过
validate:
false
作为参数。应谨慎使用此技术

save(validate: false)
总之:

  • 保存
    -如果模型是新的,则会在数据库中创建一条记录,否则会更新现有记录。运行验证,如果其中任何验证失败,则取消操作并保存返回
    false
  • 保存-如果模型是新的,则会在数据库中创建一条记录,否则会更新现有记录。运行验证,如果其中任何一个失败,就会引发
    ActiveRecord::RecordInvalid
  • save(validate:false)
    -与
    save
    相同,但完全忽略验证

尝试运行user.save!看看发生了什么这是真的并保存了新名字。这是什么意思!做什么?;)您没有提到您是如何更新名称的吗?当我尝试运行最后一行代码时,返回的是:NoMethodError:false:FalseClass的未定义方法“errors”
save(validate: false)