Rails 4 应用程序中的弃用警告(Hartl 教程)

Deprecation warning in Rails 4 application (Hartl Tutorial)

我正在学习 Michael Hartl 的 Rails 教程,当我 运行 我的测试套件时,我看到这样的错误:

DEPRECATION WARNING: You attempted to assign a value which is not explicitly
`true` or `false` to a boolean column. Currently this value casts to `false`. 
This will change to match Ruby's semantics, and will cast to `true` in Rails 
5. If you would like to maintain the current behavior, you should explicitly 
handle the values you would like cast to `false`. (called from remember at  
.../RoR_Tutorial/sample_app/app/models/user.rb:28)

DEPRECATION WARNING: You attempted to assign a value which is not explicitly 
`true` or `false` to a boolean column. Currently this value casts to `false`. 
This will change to match Ruby's semantics, and will cast to `true` in Rails 
5. If you would like to maintain the current behavior, you should explicitly 
handle the values you would like cast to `false`. (called from update at     
...RoR_Tutorial/sample_app/app/controllers/users_controller.rb:40)

似乎对 update_attribute 的调用很生气,例如:

def remember
  self.remember_token = User.new_token
  update_attribute(:remember_digest, User.digest(remember_token))
end

def update
  @user = User.find(params[:id])
  if @user.update_attributes(user_params)
    flash[:success] = 'Profile Updated'
    redirect_to @user
  else
    render 'edit'
  end
end

...任何人都可以澄清此警告试图告诉我的内容吗?

您的数据库似乎有一些 boolean 类型的列,这意味着它们的值被限制为 truefalse。根据弃用警告,您在 User 模型和 users_controller 中对 update_attributesupdate_attribute 的调用将这些属性的值设置为不同于 truefalse(尽管它无论如何都会被转换为这两个选项之一)。

只要您按照教程进行操作,似乎就没有什么可担心的:您已经被警告过将不同值转换为 truefalse 的算法正在进行中将在即将发布的 Rails.

版本中更改

虽然 Hartl 的教程可能有点过时,但看到那些类型转换对我来说还是有点奇怪。您可能需要仔细检查您的 schema.rb 和迁移文件以及书中列出的文件,以确保您的设置绝对正确。

事实证明,我用于创建测试用户的 YAML 文件中存在错误。

lana:
  name: Lana Kane
  email: hands@example.gov
  password_digest: <%= User.digest('password') %>
  activated: true,
  activated_at: <%= Time.zone.now %>

...请注意 activated: 行末尾那个讨厌的逗号。这意味着我实际上并没有将值设置为布尔值 true(猜测它认为它是 5 个字符的字符串?)。

通过将 YAML 更正为

lana:
  name: Lana Kane
  email: hands@example.gov
  password_digest: <%= User.digest('password') %>
  activated: true
  activated_at: <%= Time.zone.now %>

...(activated 行末尾没有逗号)错误消失了。