ruby-on-rails - 表 users 没有名为“password : INSERT INTO "users"”的列

标签 ruby-on-rails

在完成 Rails 教程时,我被这个错误难住了。

尝试运行验证唯一性测试时出现上述错误。在我插入用户夹具后,这些错误似乎突然出现。我不明白我做错了什么,因为我的用户模型肯定在 attr_accessible 行中定义了 :password ,即使它似乎说用户没有密码属性?无论如何,相关代码行如下:

模型/用户:

attr_accessible :email, :password, :password_confirmation, :remember_me,
:first_name, :last_name, :profile_name
validates :profile_name, presence: true, uniqueness: true

fixtures/users.yml:

name:
first_name: "user1"
last_name: "user2"
email: "email.com"
profile_name: "user"
password: "pass"
password_confirmation: "pass"

user_test.rb:

user.profile_name = users(:name).profile_name

最佳答案

has_secure_password 依赖于 BCrypt,它用于对密码进行哈希处理。您应该可以访问 BCrypt 内部装置。您也可以使用 ERB。使用此技术为已知密码创建密码哈希。

homer:
  first_name: "Homer"
  ...
  password_digest: <%= BCrypt::Password.create('donuts', cost: 4) %>

不用手动将 password_digest 设置为装置中的某个未知值,而是使用 BCrypt 为您选择的密码创建密码摘要。

现在,在您的测试中,您可以执行以下操作:

test "homer logs in with correct password" do
  user = users(:homer)

  get '/login'
  assert_success :response

  post_via_redirect '/login', username: user.username, password: user.password

  assert_equal '/profile', path
  assert_not_nil session[:user_id]
  assert_equal user.id, session[:user_id]
end

cost影响加密速度,最快为4。这有利于快速测试。

您会收到错误消息,因为 passwordpassword_confirmationhas_secure_password 添加的虚拟属性,并且未映射到数据库。 password_digest 列存储密码的加盐和加密版本(称为摘要或哈希)。夹具将属性映射到数据库列,因此如果您插入未映射到列的属性,您将收到 SQL 错误,就像您发现的那样。

关于ruby-on-rails - 表 users 没有名为“password : INSERT INTO "users"”的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15195066/

相关文章:

ruby-on-rails - Rails 中删除时的外键设置为 NULL

javascript - Bootstrap 4 DateTimePicker 不工作。图标不显示

ruby-on-rails - IronRuby On Rails VS。 Ruby On Rails(入门)

ruby-on-rails - Heroku 控制台中的预期 (200) <=> 实际 (401 未经授权)

ruby-on-rails - 如何按多个字段对 Ruby 可枚举/数组进行分组?

ruby-on-rails - 在 Yosemite 上安装 Ruby 1.9.2 时出错

javascript - Rails,从下拉菜单中选择不会触发不同的过滤器

ruby-on-rails - rubygems.org 和 github 上的 gem 版本之间的差异

ruby-on-rails - 如何确定在Rails中有一天是工作日?

ruby-on-rails - 命名空间或范围内的根目录不适用于 rails 5.0.0-beta1